Los*_*aty 5 c++ qt multithreading synchronization
我正在Qt中编写一个程序,它运行10个工作线程来计算空间中物体的轨迹.他们还必须画出物体的路径.我有一个"Body"类派生QGraphicsEllipseItem,它有一个QPainterPath."模拟"课程列出了世界上的障碍物,以及模拟和运行的身体直到身体与某物碰撞.模拟在一个单独的线程中运行(使用moveToThread完成,而不是通过继承QThread).当身体发生碰撞时,模拟会发出一个信号表明它已完成.当所有线程都已完成时,我想绘制路径(我通过调用"Body"中的方法来实现它,该方法在其draw方法中启用路径绘制).
不幸的是我得到了ASSERT错误:
ASSERT: "!unindexedItems.contains(item)" in file graphicsview\qgraphicsscenebsptreeindex.cpp, line 364
Run Code Online (Sandbox Code Playgroud)
它们似乎随机发生.我尝试过不同的连接类型,没有结果.
我正在循环中启动线程.
我正在使用Qt 5.0
Jer*_*ner 10
一般来说,使用Qt,你不能在GUI线程之外进行任何GUI操作(即执行QApplication :: exec()的线程,通常是main()线程).
因此,如果您有多个线程来操纵QGraphicsItems(特别是当前属于QGraphicsScene的QGraphicsItems),这可能是您断言失败的原因.也就是说,当Qt GUI线程正在进行窗口刷新时,它正在从各种QGraphicsItem对象中读取数据作为其计算的一部分,并且它期望QGraphicsItem在刷新操作的持续时间内保持不变.如果在执行刷新例程时(由另一个线程)更改了QGraphicsItem,则主线程进行的计算可能会变得错误/损坏,并且偶尔会导致断言失败(和/或其他不需要的行为).
如果你真的需要使用多个线程,那么你可能需要做的就是让线程在他们自己的私有数据结构上进行所有计算,这些结构是Qt GUI线程无法访问的.然后,当线程计算了它们的结果时,它们应该将结果发送回Qt GUI线程(通过排队连接或QApplication :: postEvent()).然后GUI线程可以查看结果并使用它们来更新QGraphicsItems等; 这将是"安全的",因为此更新不会在窗口更新过程中发生.
如果这听起来太多了,那么你可能会考虑在GUI线程中做所有事情; 通过这种方式使一切工作变得更加容易和简单.
| 归档时间: |
|
| 查看次数: |
4104 次 |
| 最近记录: |