gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:51 25 4
gpt4 key购买 nike

我想确认我认为 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() 触发之前执行> 信号被处理。)

我怀疑是这种情况,但我想确认。

谢谢!

最佳答案

工作线程的事件循环将被阻塞,即你将无法处理任何事件(包括那些用于信号和槽之间“排队”连接的事件,这是你在执行信号时得到的 -跨线程插槽连接),除非您自己明确触发对事件循环对象的调用。

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

关于c++ - 在 Qt 中,当事件循环线程拥有的 QObject 上的槽正在执行时,QThread 的事件循环是否会阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16989755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com