Qt和QWidget更新中的std :: thread安全性

时间:2015-09-29 12:35:49

标签: c++ multithreading qt thread-safety qwidget

我在std :: thread上运行模拟,该模拟具有常规的休眠周期,并且在每个周期结束时QWidget::update()在我的自定义QGraphicsObject上调用。它大部分时间都有效,有时在1024 ^ 2网格上计算100k迭代,但有时从QGraphicsView不再更新自己的点。我怀疑有一些多线程通信问题。

我已经读过,例如Cocos2d-x无法在其API中处理并发调用,不包括某些属性修改。我还没有在Qt文档中找到有关线程安全的信息,有些人在这里说Qt Widgets不是线程安全的。实际上QWidget :: update()是一个公共插槽,所以我应该尝试将所有直接函数调用转换为update()来发出信号吗?我想用纯c ++做我的线程,在使用Qt时有什么限制?

(如果使用像这样的std :: thread应该是安全的话,我将专门针对这个问题打开一个新问题)

1 个答案:

答案 0 :(得分:1)

在Qt中,GUI对象的方法仅在GUI(通常是主要的)线程中调用是非常重要的。

然而,只要接收器线程(插槽)正在运行事件循环(如Qt线程显然那样),Qt中的信号和插槽就可以在线程边界上工作。此线程或信号器线程没有其他要求。如果你从另一个线程发送一个信号,Qt会自动将它排入接收者线程的事件队列。

通过传递正确的连接类型参数来设置信号/插槽连接时,也可以明确这一点。请参阅explanation of connection types in Qt doc

所以答案是肯定的,你无法从其他线程可靠地调用任何窗口小部件方法,是的,信号/插槽机制是在从工作线程触发GUI操作时确保线程安全的正确方法。