问题陈述:使用相机跟踪对象并相应地移动相机的方位角和高度。
处理:相机获取对象的图像....处理相机的每一帧以找到对象(应该跟踪...)和每帧中生成的信息被传递到机械设备(万向节......)以使摄像机平移和倾斜......
设计:主要的Gui是在一个线程和相机和万向节中运行的另外两个线程...在相机线程中生成的信息传递给万向节线程和相同的线程(相机线程。 ..)显示跟踪图像...
约束:显示速度比云台的移动速度快 ......所以在每一帧......
下图显示了Qt ..中的类和信号和插槽连接的设计。
如果可能的话,请建议任何更好的解决问题的方法......
错误:有时我会收到错误...
QObject :: killTimers:无法从其他线程停止计时器
答案 0 :(得分:0)
对我来说,你应该避免在线程之间调用这样的函数, 这是一个想法,这就是我安全地交换大量数据的方式。
并且您应该拥有状态机,两个线程都可以访问共享的可锁定变量(一个指向主线程的指针,指向ping或pong缓冲区+一个锁定的互斥锁)
通过这种方式你可以改变你使用数据的方式,“显示”应该始终使用相同的指针。 它应该在开始读取和释放之后获得锁定。相机应该写入另一个缓冲区 在摄像机写入之后,摄像机线程应该尝试获取互斥锁的锁定并且如果它获取它(即另一个线程没有读取其他缓冲区),则摄像机线程应该采取锁定并更改指向的缓冲区。主线程使用的指针)
这样你就不会在线程之间进行相互排斥。
最大的风险是永远无法从相机线程获取锁定,这是一个解决方案 - > 为了限制锁定时间,我建议你在每个线程中有一个第二个缓冲区,这样锁定时间就会减少到“memcpy”持续时间。 添加一个bool到结构,这就是说你的相机是否更新了数据。
如果是,则主线程复制数据。 (并且在此期间相机无法交换指针)但是一旦完成,主线程也会将bool重置为false。 直到这个bool恢复为真,你不需要锁定来复制数据。 (现在这是无锁交换) 请注意,这只是因为读取bool是原子动作。
我希望它有所帮助
(对不起我的英文)