【发布时间】:2012-04-19 18:15:50
【问题描述】:
我有一个包含大约 1000 个 QGraphicsItems 的 QGraphicsScene,它们实际上是物理项目。他们前进的每一帧,检查碰撞,并解决这些碰撞,等等。我真的很想让物理多线程。
据我了解,QGraphics 类不是线程安全的。意思是,它们只能从主线程调用。这是否迫使我使用信号/插槽机制将每帧的最终项目属性(x、y、旋转)发送到主线程,然后使用主线程方法实际更新 QGraphicsItems?或者有更简单的方法吗?
以下只是一个假设:我可以使用 QtConcurrent 在我的 QGraphicsItems 列表上运行一个方法吗?如果我在我的 QGraphicsItem 绘制方法中使用 QMutex 并在我的物理方法中使用 QMutex(这将改变我的 QGraphicsItem 的属性),这是否可以保证在任何时候只有一个线程正在读取/写入每个 QGraphicsItem?
【问题讨论】:
-
我读过一些关于在连接信号/插槽时使用 QueuedConnection 的内容。我没有尝试过,甚至没有研究过细节,但我认为值得进一步研究。有没有其他人有这方面的经验?
-
我使用了Box2D的Delphi端口,非常满意。为什么不试一试呢?如果您有兴趣,请前往page。
-
Box2D 看起来很有趣,但我没有看到它是多线程的。
-
QtConcurrent 看起来很有趣。我已经有了我的 QGraphicsItems 的列表,如果我可以使用 QtConcurrent 在每个项目上运行一个函数,那么物理学会很容易。我的理解是,如果 2 个线程试图同时访问同一个内存,这可能会导致问题。例如,QGraphicsItem 在被 QtConcurrent 修改时被绘制。那么,有没有办法在 QtConcurrent 运行时“暂停”绘制场景?
标签: c++ multithreading qt user-interface physics