繁体   English   中英

QT中的串行端口和OpenCV线程

[英]Serial Port and OpenCV threading with in QT

我正在编写一个必须使用并行处理的程序(C ++),它将调用某些函数,并且某些Windows将通过模拟的串行端口(qserialport)与我的硬件进行交互。

我在定义软件的基本结构时遇到了严重的问题(主要是因为我不知道如何使用并行化)。

连接有一个连续通讯的串行端口,并且硬件具有通过USB连接的摄像头,使用OpenCV库处理视频。

我需要同步并在paralell中执行这些任务,我感到很困惑。

我有一个使串口工作的类。 我有一堂课,将与相机一起工作并执行识别任务。 我想我会有一个同步这些任务的线程。 我有一个主窗口,它将与这些任务交互。 目前,所有这些部分都在主线程中运行。

主线程与其他线程进行通信的最佳方式是什么? 和同步? (这对我来说非常复杂,因为我在主线程中使用了一些数据,例如图像或配置串行端口)。 做到这一点的“正确”方法是什么(我理解这是一个非常抽象的问题,我也认为我的问题很普遍,所以所有建议都将受到欢迎)? 我需要多少个线程?

PS:现在,我有一个在主窗口中定义的结构,它维护着指向其他初始化对象(例如Vision和SerialPort)的指针,它可以工作,但是我需要锁定直到软件能够识别或硬件进行移动为止。是个大问题! 如果我尝试将这些结构移动到线程中,程序将崩溃。

非常感谢!

我从您的标签中看到您正在使用Qt。 因此,如果您尚未使用QThreads ,我建议您使用它们,因为它们使很多事情变得容易。 使用QThreads时,您将创建一个继承每个帮助程序线程QObject的类。

至于线程数,我认为您至少需要3个(主或ui,视频和串行端口)。 您可以做更多的事情,但是除非您有特定的需求,否则我不会做的(例如,我经常使用2个辅助线程进行视频,一个用于捕获,一个用于处理)。

我建议使用信号和插槽在线程之间进行通信,而不是直接调用函数。 您可以使用多种方法使用不同的ConnectionTypes在Qt中的线程之间进行连接 如果您想即时调用某些内容,也可以使用QMetaObject :: invokeMethod 如果以这种方式进行交互(DirectConnection除外),则将在对象中存在的线程中调用该函数,从而减少了在类中保持线程安全的许多困难。

同步非常模糊,因此将完全取决于您的需求。 有时,您可以使用BlockingQueuedConnection来实现此目的,该方法将阻塞在调用线程中,直到在另一个线程中完成(有效地使它们成为同一线程,直到返回)。 其他时候,仅在某些事件发生时发送通知信号(例如,帧已准备就绪)将使事情保持足够近的程度,无关紧要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM