gpt4 book ai didi

multithreading - 如何在主线程上执行回调

转载 作者:行者123 更新时间:2023-12-03 13:05:14 29 4
gpt4 key购买 nike

我将一个对象实例传递给一个不透明的模块,该模块在我的对象上执行 SLOT 方法(回调)。调用模块在不同的线程上。我需要在我的主线程上执行这些方法。我想我可以用信号和槽来做到这一点,但信号方法仍在调用者线程上执行。我认为我不应该使用 moveToThread() 将我的对象移动到调用者线程 - 没有一种机制可以向我的应用程序主线程发出信号吗?

MyClass::MyClass(...)
{
OtherClass::getInstance()->setCallback(this);
connect(this, SIGNAL(mySignalToMainThread()), this, SLOT(doThisOnMainThread()));
}

// Public slot, called by OtherClass on its own thread.
void MyClass::someCallback()
{
emit mySignalToMainThread();
}

void MyClass::doThisOnMainThread()
{
// AHHH! I am still on callers thread.
}

最佳答案

起初,我认为从 MyClass 所在的线程上下文之外的线程上下文发射信号可能是一个问题。但是,Qt thread documentation states :

...you can safely emit signals from your QThread::run() implementation, because signal emission is thread-safe.



这几乎打消了这个想法。而且,您使用的是 Qt::AutoConnection , for which the documentation states :

If the signal is emitted from a different thread than the receiving object, the signal is queued, behaving as Qt::QueuedConnection. Otherwise, the slot is invoked directly, behaving as Qt::DirectConnection. The type of connection is determined when the signal is emitted.



最后一点特别重要。如果您要编写此代码:
void MyClass::someCallback() 
{
Q_ASSERT(QThread::currentThread() != this->thread());
emit mySignalToMainThread();
}

void MyClass::doThisOnMainThread()
{
Q_ASSERT(QThread::currentThread() == this->thread());
}

我希望没有断言失败,但你建议你有一个。我不得不得出结论,要么 Qt 文档是错误的,要么这个问题比你提到的更多。

关于multithreading - 如何在主线程上执行回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12607733/

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