我有这个功能来更新一些GUI内容:
void SavedConnections::renderList()
{
// Do GUI stuff! Must run in Qt thread!!!
...
}
我需要确保不从其他线程调用此函数。我打算做的是将其推迟到事件循环并发出警告:
void SavedConnections::renderList()
{
if(!this_thread_is_Qt_GUI_thread()) {
qDebug()<< "Warning: GUI operation attempted from non GUI thread!\n";
QCoreApplication::postEvent(this, new UpdateGUIEvent());
return;
}
// Do GUI stuff! Must run in Qt thread!!!
...
}
这种模式也非常方便,可以保证在GUI线程中异步运行的方法没有任何丑陋的语法。 I already asked similar question about Java's ExecutorService
答案 0 :(得分:5)
您可以检查当前线程是否是您的对象所在的线程:
if (QThread::currentThread() != this->thread()) {
// Called from different thread
}
请注意,这可能不是主要的GUI-Thread !它是this
所涉及的主题(请参阅QObject Thread affinity)。如果您不使用QObject::moveToThread
更改它,则它是创建对象的主题。
这也是QCoreApplication::postEvent
用来确定事件应该发布到哪个线程的内容。目标线程必须运行QEventLoop
才能响应该事件。
因此检查主GUI-Thread(qApp->thread()
),但如果您的对象不在主GUI中,则发布到this
的线程可能不起作用 - 线。但是,如果你在那里做GUI的东西,它应该存在于GUI-Thread