我在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秒执行的测试。