gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:57 25 4
gpt4 key购买 nike

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

过程:相机获取物体的图像....相机的每一帧都经过处理以找到物体(应该被跟踪......)以及每帧中生成的信息被传递给机械装置(万向节...)来移动相机的平移和倾斜...

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

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

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

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

enter image description here

如果可能,请提出解决问题的更好方法...

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

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

最佳答案

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

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

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

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

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

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

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

希望对你有帮助

(对不起我的英语)

关于c++ - Qt中用于线程间通信的类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12627084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com