已接收到GUI的QThread信号,但未异步响应



我在QObject派生类下进行了大量计算。我通过GUI中的一个按钮将它移动到我的新qthread中,创建它只是为了执行该计算。

GUI应该在循环中等待来自工作线程的消息(因为在执行按钮槽之后,它就会到达那里)。

我通过信号和插槽机制发出消息,如下所示。我有一个通用类Controller,它执行线程的创建并将其与GUI(MainWindow)连接:

QThread* thread = new QThread;
Raytracer* worker = new Raytracer();
worker->moveToThread(thread);
QObject::connect(thread, &QThread::started, worker, &Raytracer::execute);//, Qt::QueuedConnection);
QObject::connect(worker, &Raytracer::textEmitted, gui_, &MainWindow::addText, Qt::QueuedConnection);
QObject::connect(worker, &Raytracer::hitEmitted, gui_, &MainWindow::hitReceived, Qt::QueuedConnection);
QObject::connect(worker, &Raytracer::finished, worker, &Raytracer::deleteLater, Qt::QueuedConnection);
QObject::connect(worker, &Raytracer::finished, thread, &QThread::quit, Qt::QueuedConnection);
QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater, Qt::QueuedConnection);
QObject::connect(thread, &QThread::finished, this, &MainController::finishedCalculation, Qt::QueuedConnection);

thread->start();

关于类Raytracer:

class Raytracer : public QObject
{
Q_OBJECT

在计算过程中,它会发出这样的信号:

emit textEmitted(QString("Number %1n").arg(number));

GUI在这里接收信号:

void addText(const QString& text) { outputBox_->append( text ); }

接收信号并将其正确添加到GUI中的文本框中但它们在线程刚结束时就出现了。在计算过程中不会,无论它有多长。

所有的信息都收到了。因此,它将它们保存在某个缓冲区中,并在最后更新文本。

我做错了什么?在哪些情况下会发生这种情况?它怎么能测试它呢

GUI线程被其他东西阻塞,或者您的其他线程在工作时没有发出信号,而只是在最后发出信号。您没有显示足够的代码来诊断错误。

我有一个独立的例子,它几乎完成了您想要做的事情。唯一需要的更改是在runTest的末尾(在emit之后)添加QThread::msleep(1000);。这将近似于一个需要1秒执行的测试。

相关内容

  • 没有找到相关文章

最新更新