gpt4 book ai didi

c++ - 如何设置线程和子线程之间的信号/槽连接?

转载 作者:行者123 更新时间:2023-11-28 06:41:48 26 4
gpt4 key购买 nike

我有一个派生自 QThread 的类 ParentThread,它具有以下 run() 方法,大致如下所示:

void ParentThread::run()
{
QThread *childThread = new QThread;
QObject::connect(childThread, SIGNAL(finished()), this, SLOT(onChildThreadFinished());
QObject::connect(childThread, SIGNAL(finished()), childThread, SLOT(deleteLater());
childThread->start();

exec();
}

onChildThreadFinished() 定义在 ParentThread 上,应该在 ParentThread 的上下文中运行。但是,使用上面的代码,只有在信号/槽连接是 Qt::DirectConnection 时才会调用 onChildThreadFinished,然后在子线程的上下文中运行。如果信号/槽连接被定义为 Qt::QueuedConnection,槽永远不会被调用。我正在使用 Qt 4.8.5。知道这里的问题是什么吗?

最佳答案

您声明插槽 onChildThreadFinished() 是在 ParentThread 上定义的,并且应该在 ParentThread 的上下文中运行。这个假设是错误的。这是不鼓励对 QThread 进行子类化的原因之一。

如果你想在你的线程中使用槽,子类化 QThread 不是你想要做的。请改用 worker-object 方法。子类 QObject 并调用 QObject::moveToThread将对象移动到新线程。

这是 Qt 文档对此的说法:

It is important to remember that a QThread instance lives in the old thread that instantiated it, not in the new thread that calls run(). This means that all of QThread's queued slots will execute in the old thread. Thus, a developer who wishes to invoke slots in the new thread must use the worker-object approach; new slots should not be implemented directly into a subclassed QThread.

关于c++ - 如何设置线程和子线程之间的信号/槽连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25835681/

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