在Qt中,当事件循环的线程拥有的QObject上的一个槽正在执行时,QThread的事件循环是否阻塞?

Dan*_*aum 6 c++ qt multithreading event-loop signals-slots

我想确认一下我认为Qt中工作线程的直接方面.

假设我创建了一个QThread,其目的是在相应的线程中管理耗时的工作.此外,假设我允许通过调用start()QThread 来运行此线程的相应事件循环.工作本身由一个由QThread started()信号发出信号的成员函数(槽)执行.

那是(从/sf/answers/772745151/复制):

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();
Run Code Online (Sandbox Code Playgroud)

我的问题如下.据我所知,工作线程的事件循环将从finished()信号中接收一个触发器,以便调用实例deleteLater()上的插槽task.此外,此事件循环将在doWork()函数返回后很快运行,因此它将准备好并可用于处理来自finished()刚刚通过函数finished()末尾的调用添加到工作线程的事件队列的信号的触发器doWork().

我想确认在内部执行的耗时操作doWork()(在finished()发出之前和doWork()函数退出之前)的整个过程中,工作线程内的事件循环在插槽函数上被阻塞doWork(),因此工作线程将在执行耗时功能的整个过程中,响应由事件循环线程拥有的任何对象触发的任何槽doWork().(因此,doWork()一旦工作线程的事件循环再次激活,并且在finished()处理来自信号的触发之前,任何此类插槽将仅在退出后执行.)

我怀疑是这种情况,但我想证实.

谢谢!

Fre*_*abe 7

工作线程的事件循环将被阻止,即您将无法处理任何事件(包括用于信号和插槽之间的"排队"连接的事件,这是您在执行信号插槽连接时获得的事件除非你自己明确地触发对事件循环对象的调用.

但是,您仍然可以在工作线程中执行插槽,这些插槽由工作线程发出的信号触发,因为这些是普通函数调用,不需要运行事件循环.