如何处理 QThread 上的事件?
Posted
技术标签:
【中文标题】如何处理 QThread 上的事件?【英文标题】:How do I process events on a QThread? 【发布时间】:2013-07-15 16:11:13 【问题描述】:通常,如果我在处理密集型函数中,我可以调用 QCoreApplication::processEvents()
或 QEventLoop::processEvents()
以确保我的处理不会阻塞其他信号和插槽。
但是,如果我创建一个新的 QThread
并将一个工作线程移动到该线程,那么我就没有 QCoreApplication
或 QEventLoop
可以用来调用 processEvents()
。
根据我的研究,似乎我应该能够在我创建的新QThread
上安装QEventLoop
,然后我可以在那个QEventLoop
上调用processEvents()
。
但是,我不知道该怎么做。我想它可能看起来像这样:
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
我尝试启动循环的每个地方都有某种问题。但是,即使这样的事情奏效了,我怎么会在那个QEventLoop()
上调用processEvents()
?
另外,QThread
也有一个函数 setEventDispatcher()
和 QAbstractEventDispatcher
有一个 processEvents()
函数,但我似乎找不到任何子类 QAbstractEventDispatcher
。
在QThread
的密集工作函数期间处理事件的正确方法是什么?
【问题讨论】:
【参考方案1】:根据文档,调用QCoreApplication::processEvents()
会为调用它的线程处理事件。
【讨论】:
啊!谢谢!我认为要使用QCoreApplication::processEvents()
,我必须创建一个新的QCoreApplication
。但看来我的QThread
仍然是先前存在的QCoreApplication
的一部分。【参考方案2】:
但是,如果我创建一个新的
QThread
并将一个工作线程移动到该线程,那么我就没有QCoreApplication
或QEventLoop
可以用来调用processEvents()
。
完全正确 - 不要调用它。你不需要它,你不想要它。
【讨论】:
以上是关于如何处理 QThread 上的事件?的主要内容,如果未能解决你的问题,请参考以下文章
QThread::quit() 是立即结束线程还是等到返回事件循环?