4

问题陈述:用相机跟踪物体并相应地在方位角和仰角上移动相机。

过程:相机获取物体的图像......相机的每一帧都被处理以找到物体(应该被跟踪......),并且在每一帧中产生的信息被传递给机械设备(云台...... .) 以平移和倾斜移动相机...

设计:主 Gui 在一个线程中运行,相机和云台在 2 个其他线程中运行...在相机线程中生成的信息被传递到云台线程,并且同一线程(相机线程...)显示跟踪的图像...

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

  1. 处理和显示帧(以 10 毫秒的速率)
  2. 生成的信息传递到云台
  3. 云台线程暂停更长的时间(100 ms),以给机械部件移动时间,并确保云台在完成移动之前没有新的更新。

下图展示了 Qt 中类和信号槽连接的设计。

在此处输入图像描述

如果可能的话,请提出任何更好的方法来解决这个问题......

错误:有时我得到一个错误...

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

4

1 回答 1

0

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

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

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

相机应该写入另一个缓冲区 相机写入后,相机线程应该尝试获取互斥锁的锁,如果它获得它(即另一个线程没有读取另一个缓冲区),那么相机线程应该获取锁定并更改主线程使用的指针指向的缓冲区)

这样你就没有线程之间的通信,只是互斥。

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

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

我希望它有帮助

(对不起我的英语不好)

于 2012-09-27T18:55:26.717 回答