通常,如果我处于进程密集型函数中,我可以调用 QCoreApplication::processEvents()QEventLoop::processEvents() 以确保我的处理不会阻塞其他信号和插槽。

但是,如果我创建一个新的 QThread 并将一个 worker 移动到该线程,那么我就没有 QCoreApplicationQEventLoop 可以用来调用 processEvents()

从我的研究看来,我应该能够在我创建的新QEventLoop上安装QThread,然后可以在该processEvents()上调用QEventLoop

但是,我无法弄清楚如何做到这一点。我想它可能看起来像这样:

QThread *thread = new QThread(this);
Worker *worker = new Worker(this);
QEventLoop *loop = new QEventLoop();

connect(thread, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
connect(thread, SIGNAL(started()), worker, SLOT(startProcessing()));
connect(worker, SIGNAL(done()), thread, SLOT(quit()));
connect(worker, SIGNAL(done()), loop, SLOT(quit()));

worker->moveToThread(thread);

//loop->exec() // blocks processing of this thread
loop->moveToThread(thread);

//loop->exec() // loop is not a member of this thread anymore and even
               // if it was, this would block the thread from starting
thread->start();
//loop->exec(); // loop is not a member of this thread anymore and even
                // if it was, this would block this thread from continuing

我尝试开始循环的每个地方都有某种问题。但即使这样的事情有效,我将如何在该 processEvents() 上调用 QEventLoop()

或者, QThread 也有一个函数 setEventDispatcher() 并且 QAbstractEventDispatcher 有一个 processEvents() 函数,但我似乎找不到任何子类 QAbstractEventDispatcher 的东西。

QThread上的强化工作程序功能期间处理事件的正确方法是什么?

最佳答案

根据文档,调用QCoreApplication::processEvents()会处理任何线程调用它的事件。

关于c++ - 如何处理 QThread 上的事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17658811/

10-09 23:10