![](/img/trans.png)
[英]Confusion regarding QThread, QObject, Thread Affinity and Event Loop
[英]In Qt, does a QThread's event loop block while a slot on a QObject owned by the event loop's thread is executing?
我想确认一下我认为Qt中工作线程的直接方面。
假设我创建了一个QThread,其目的是在相应的线程中管理耗时的工作。 此外,假设我允许通过在QThread上调用start()
来运行此线程的相应事件循环。 工作本身由成员函数(槽)执行,该函数由QThread的started()
信号发出信号。
那是(从https://stackoverflow.com/a/11039216/368896复制):
class Task : public QObject
{
Q_OBJECT
public:
Task();
~Task();
public slots:
void doWork()
{
//very time-consuming code is executed here before the next line is reached...
emit workFinished(); // Calls workFinished() signal (after a long time)
}
signals:
void workFinished();
};
// ... in the main thread:
QThread *thread = new QThread( );
Task *task = new Task();
task->moveToThread(thread);
connect( thread, SIGNAL(started()), task, SLOT(doWork()) );
connect( task, SIGNAL(workFinished()), thread, SLOT(quit()) );
//automatically delete thread and task object when work is done:
connect( thread, SIGNAL(finished()), task, SLOT(deleteLater()) );
connect( thread, SIGNAL(finished()), thread, SLOT(deleteLater()) );
thread->start();
我的问题如下。 我知道工作线程的事件循环将从finished()
信号接收一个触发器,以便调用task
实例上的deleteLater()
槽。 此外,此事件循环将在doWork()
函数返回后很快运行,因此它将准备好并可用于处理来自刚刚通过调用添加到工作线程的事件队列的finished()
信号的触发器。在doWork()
函数结束时finished()
。
我想确认该耗时的操作的整个过程期间内正在执行doWork()
前finished()
发出后,之前doWork()
函数退出),即工作线程内的事件循环被阻断的插槽函数doWork()
因此工作线程将不会响应在耗时的doWork()
函数的整个执行过程中由事件循环的线程拥有的任何对象上触发的任何插槽。 (因此,任何此类插槽只会在doWork()
退出后,一旦工作线程的事件循环再次激活,并且在处理finished()
信号的触发之前执行。)
我怀疑是这种情况,但我想证实。
谢谢!
工作线程的事件循环将被阻止,即您将无法处理任何事件(包括用于信号和插槽之间的“排队”连接的事件,这是您在执行信号插槽连接时获得的事件除非你自己明确地触发对事件循环对象的调用。
但是,您仍然可以在工作线程中执行插槽,这些插槽由工作线程发出的信号触发,因为这些是普通函数调用,不需要运行事件循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.