Qt和QWidget更新中的std::线程安全
std::thread safety in Qt and QWidget update
我有一个在std::线程上运行的模拟,该线程具有固定的睡眠周期,并且在每个周期结束时在我的自定义QGraphicsObject上调用QWidget::update()。它在大多数情况下都能工作,有时在1024^2的网格上计算100k次迭代,但有时从某个点开始,QGraphicsView不再更新自己。我怀疑有多线程通信问题。
我读到Cocos2d-x例如不能处理并发调用在它的API排除一些属性修改。我没有在Qt文档中找到关于线程安全的信息,这里的一些人说Qt Widgets不是线程安全的。实际上QWidget::update()是一个公共槽,所以我应该尝试将所有直接函数调用转换为update()来发出信号吗?我想做我的线程在纯c++,这与Qt工作时的约束是什么?
(我将打开一个新的问题,特别是如果使用std::线程这样应该是安全的问题)
在Qt中,GUI对象的方法只在GUI(通常是主线程)线程中调用是非常重要的。
然而,Qt中的信号和插槽在线程边界上工作,只要接收线程(插槽)正在运行事件循环(正如Qt线程显然所做的那样)。在此线程或信号发送者的线程上没有其他要求。如果你从一个不同的线程发送一个信号,Qt会自动将它加入接收线程的事件队列。在设置信号/槽连接时,也可以通过传递正确的连接类型参数来显式设置。参见Qt文档中连接类型的说明。
所以答案是肯定的,你不能可靠地从其他线程调用任何小部件方法,是的,信号/插槽机制是确保从工作线程触发GUI操作时线程安全的适当手段。
相关文章:
- 即发即弃 std::线程对象清理自身
- std::线程导致程序中止
- 在std::线程中使用已分配的结构数据
- 使用-static libstdc++时std::线程弱,因此在运行时会导致崩溃
- std::线程与 pthread_setschedparam 与 C++ 11.
- 运行 std::线程不在构造函数中
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 编译问题 C++ 同时,尝试通过调用另一个对象中的成员函数来创建 std:: 线程
- 错误:静态断言失败:std ::线程参数必须在转换为rvalues后不可行
- C STD ::线程中的种族状况或内存损坏
- 在 Valgrind 输出中仍然可以访问 std 线程向量的块
- 将类Cotaining std ::线程添加到向量
- 如何使用mingw编译C STD ::线程代码
- 从其他std ::线程更新QT GUI
- STD ::线程不会退出
- 处理 std::线程包装器类的立即销毁
- C++ std 线程并列出分段错误(核心转储)
- 杀死后的STD ::线程如何处理
- 干净取消在输入/输出调用中被阻止的 std::线程
- std ::线程最大并发线程