QT

时间:2016-10-19 04:16:47

标签: c++ multithreading qt opencv asynchronous

我制作必须使用并行处理的程序(C ++),它会调用某些函数,而某些窗口将通过模拟串行端口(qserialport)与我的硬件交互。

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

连接的串口正在连续通话,硬件也有通过USB连接的摄像头,使用OpenCV库来处理视频。

我需要同步并在并列中完成这些任务,我有严重的困惑。

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

主线程与其他线程通信的最佳方式是什么?并同步? (这对我来说非常复杂,因为我在主线程中使用了一些数据,比如图像或配置串口)。 什么是"正确"这样做的方式(我明白这是一个非常抽象的问题,我认为我的问题非常普遍,那么所有的建议都会很受欢迎)?我需要多少个线程?

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

非常感谢!

1 个答案:

答案 0 :(得分:0)

我从你的标签中看到你正在使用Qt。因此,我建议使用QThreads,如果你还没有,因为他们会让事情变得更容易。使用QThreads时,您创建一个为每个辅助线程继承QObject的类。

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

我建议在带有信号和插槽的线程之间进行通信,而不是直接调用函数。您可以通过多种方式使用不同的ConnectionTypes在Qt中的线程之间进行连接。如果您想动态调用某些内容,也可以使用QMetaObject::invokeMethod。如果您以这种方式进行交互(除了DirectConnection),您将在对象所在的线程中调用该函数,从而减少了在类中保留thread safe的难度。

同步非常模糊,因此将非常依赖于您的需求。有时您可以使用BlockingQueuedConnection来实现这一点,BlockingQueuedConnection将在调用线程中阻塞,直到在另一个线程中完成(有效地使它们成为相同的线程,直到它返回)。其他时候只是在某些事件发生时发送通知信号(例如帧准备好)会使事情保持足够接近而不重要。