如何处理 QThread 上的事件?

Posted

技术标签:

【中文标题】如何处理 QThread 上的事件?【英文标题】:How do I process events on a QThread? 【发布时间】:2013-07-15 16:11:13 【问题描述】:

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

但是,如果我创建一个新的 QThread 并将一个工作线程移动到该线程,那么我就没有 QCoreApplicationQEventLoop 可以用来调用 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 并将一个工作线程移动到该线程,那么我就没有 QCoreApplicationQEventLoop 可以用来调用 processEvents()

完全正确 - 不要调用它。你不需要它,你不想要它。

【讨论】:

以上是关于如何处理 QThread 上的事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理片段上的触摸事件?

QThread::quit() 是立即结束线程还是等到返回事件循环?

Qt:将事件发布到 QThread 的正确方法?

如何处理表格布局的每个单元格上的点击事件

QT事件循环与QThread类的关闭quit(),wait()

Jquery mobile - 如何处理body标签上的点击事件?