用于线程间通信的Qt中的类设计

时间:2012-09-27 17:38:15

标签: c++ multithreading qt uml qthread

问题陈述:使用相机跟踪对象并相应地移动相机的方位角和高度。

处理:相机获取对象的图像....处理相机的每一帧以找到对象(应该跟踪...)和每帧中生成的信息被传递到机械设备(万向节......)以使摄像机平移和倾斜......

设计:主要的Gui是在一个线程和相机和万向节中运行的另外两个线程...在相机线程中生成的信息传递给万向节线程和相同的线程(相机线程。 ..)显示跟踪图像...

约束:显示速度比云台的移动速度快 ......所以在每一帧......

    处理并显示
  1. 帧(以10毫秒的速率)
  2. 生成的信息传递给gimbal
  3. 万向节螺纹悬挂较长时间(100毫秒),以便给机械部件移动时间,并确保云台没有新的更新,直到它完成运动..
  4. 下图显示了Qt ..中的类和信号和插槽连接的设计。

    enter image description here

    如果可能的话,请建议任何更好的解决问题的方法......

    错误:有时我会收到错误...

    QObject :: killTimers:无法从其他线程停止计时器

1 个答案:

答案 0 :(得分:0)

对我来说,你应该避免在线程之间调用这样的函数, 这是一个想法,这就是我安全地交换大量数据的方式。

并且您应该拥有状态机,两个线程都可以访问共享的可锁定变量(一个指向主线程的指针,指向ping或pong缓冲区+一个锁定的互斥锁)

通过这种方式你可以改变你使用数据的方式,“显示”应该始终使用相同的指针。 它应该在开始读取和释放之后获得锁定。

相机应该写入另一个缓冲区 在摄像机写入之后,摄像机线程应该尝试获取互斥锁的锁定并且如果它获取它(即另一个线程没有读取其他缓冲区),则摄像机线程应该采取锁定并更改指向的缓冲区。主线程使用的指针)

这样你就不会在线程之间进行相互排斥。

最大的风险是永远无法从相机线程获取锁定,这是一个解决方案 - > 为了限制锁定时间,我建议你在每个线程中有一个第二个缓冲区,这样锁定时间就会减少到“memcpy”持续时间。 添加一个bool到结构,这就是说你的相机是否更新了数据。

如果是,则主线程复制数据。 (并且在此期间相机无法交换指针)但是一旦完成,主线程也会将bool重置为false。 直到这个bool恢复为真,你不需要锁定来复制数据。 (现在这是无锁交换) 请注意,这只是因为读取bool是原子动作。

我希望它有所帮助

(对不起我的英文)