2016-10-19 49 views
0

我正在制作一个必须使用并行处理的程序(C++),它将调用一些函数,并且一些窗口将通过模拟串行端口(qserialport)与我的硬件交互。QT中的串行端口和OpenCV线程

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

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

我需要同步并完成这些任务并且我有严重的混淆。

我有一个班,将使串行端口工作。我有一门课程可以与相机一起工作并完成识别任务。我想我会有一个线程来同步这些任务。我有一个主窗口,将与这些任务交互。目前,所有这些作品都在主线程中运行。

主线程与其他人进行通信的最佳方式是什么?并同步? (这对我来说很复杂,因为我在主线程中使用了一些数据,比如图像或配置串口)。 什么是“正确”的方式来做到这一点(我明白这是一个非常抽象的问题,我认为我的问题非常普遍,那么所有的建议都会很好地被接受)?我需要多少个线程? PS:现在,我有一个在主窗口中定义的结构,它维护着指向其他初始化对象(如Vision和SerialPort)的指针,它可以工作,但我需要锁定,直到软件识别或硬件做出动作,这是一个大问题!如果我尝试将这些结构移到一个线程,程序崩溃。

非常感谢!

回答

0

我从你的标签看到你正在使用Qt。因此,如果您不是已经在使用QThreads,那么他们会让许多事情变得更简单。当使用QThreads时,您将为每个辅助线程创建一个继承QObject的类。

至于线程的数量,我认为你会想要至少3(主要或用户界面,视频和串行端口)。你可以做更多,但我不会,除非你有特定的需求(例如,我经常使用2个助手线程的视频,一个捕获和一个处理)。

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

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

+0

非常感谢您的回答克里斯,也是您的时间! 现在我有严重的问题来同步我的QThread的,但你的答案是好的。按照您的建议使用这两个qthread,并使用另一个QThread来管理它们之间的同步。 现在我不能将这些qthreads与主线程进行通信,当我尝试从主线程向这些线程发送信号时我没有问题,但是当我尝试向主线程发送信号时,我在执行时收到警告。我会用一些代码片段来打开另一个问题。谢谢!迭戈 – Diego