通常,如果我处于流程密集型功能,我可以调用QCoreApplication::processEvents()
或QEventLoop::processEvents()
以确保我的处理不会阻止其他信号和插槽。
但是,如果我创建一个新的QThread
并将工作人员移动到该线程,那么我没有QCoreApplication
或QEventLoop
来调用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
上强化工作人员功能期间处理事件的正确方法是什么?
答案 0 :(得分:15)
根据文档,调用QCoreApplication::processEvents()
处理任何线程的事件。
答案 1 :(得分:-6)
但是,如果我创建一个新的
QThread
并将工作人员移动到该线程,那么我没有QCoreApplication
或QEventLoop
来调用processEvents()
}。
确实 - 不要打电话给它。你不需要它,你不需要它。