在Qt的类设计线程间通信(Class Design in Qt for inter thread c

2019-09-23 03:03发布

问题陈述 :跟踪与摄像机的对象,并在方位角和仰角相应地移动相机。

过程 :相机获取对象的图像....相机的每个帧进行处理,以找到对象(这是应该被跟踪...)和在每帧生成的信息被传递给机械设备(万向.. 。)移动相机平移和倾斜?

设计 :主界面运行在一个线程和摄像头和万向节其他2线......在相机线程产生的信息被传递给万向线程,同一个线程(线程的相机......)显示跟踪图像...

约束:显示速率比万向节的移动速率快 ...因此在每一帧...

  1. 帧进行处理和显示(在10毫秒的速率)
  2. 生成的信息传递到万向节
  3. 万向线程被挂起较长的时间(100毫秒),以便有时间对机械部件移动,并确保没有新的更新涉及到万向节,直到它完成其运动..

下图显示的类和信号和槽连接Qt中的设计..

请提出更好的办法如果可能的话去了解这个问题...

错误 :有时候,我得到一个错误?

的QObject :: killTimers:定时器不能从另一个线程停止

Answer 1:

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

你应该有状态机与两个线程访问到共享锁定的变量(一个指针,用于指向Ping或Pong缓冲区+为您锁定互斥你的主线程)

这样一来,你可以改变你使用数据的方式,“显示”,应始终使用相同的指针。 开始读取后释放时,它应该获得的锁。

该相机应该在其他缓冲区写入相机所著后,相机螺纹应尽量LO获取该互斥锁,如果它获得它(即其他线程不读其他的缓冲溶液),然后将相机线程应采取锁定和改变由主线程所使用的指针所指向的缓冲液)

这样,你刚才的互斥线程之间没有沟通。

最大的风险是永远无法获得从相机螺纹锁,这里是一个解决方案 - >为了限制的锁定时间,我建议你在每个线程第二缓冲区,以便锁定时间将减少到在“memcpy的”持续时间。 一个布尔结构中添加,那是说,如果你的相机更新的数据或没有。

如果是的话,主线程中的数据复制。 (和相机无法在这段时间内交换指针),但一旦完成,你主线程也BOOL复位为false。 而直到这个布尔是回到真正的你并不需要锁定到复制数据。 (现在这个锁是自由交换)请注意,仅仅是因为读取布尔是一个原子操作,这是真实的。

我希望它能帮助

(对不起我的英语不好)



文章来源: Class Design in Qt for inter thread communication