在国米的Qt线程通信的实现(Implementation of Inter Thread Commu

2019-07-04 19:26发布

我有问题,实施以下情形。 我的问题描述是这样的:

  1. 我有3个线程。 ThreadCamera用于从摄像机抓取的帧。 ThreadProcess用于处理(用做一些OpenCV的图像处理的图像/帧上抓起)用于显示图像的帧和主GUI线程。
  2. 我不知道ThreadProcess将花费多少时间来处理图像。 所以我想从ThreadCamera通过图像ThreadProcess,做形象上的一些图像处理,并将其传递到主界面线程来显示。
  3. 当ThreadProcess处理图像的ThreadCamera应该睡觉了。 也就是说, 它不应该抓住从相机进一步帧 。 当ThreadProcess完成图像处理任务,它应该通过图像和一些信息主界面线程。 在此之后仅ThreadCamera应该醒来并从摄像机在此(ThreadCamera)线程运行过程中出现抢下一帧/图像。

感谢名单家伙......经过一番评论把相机和图像处理作业在一个单独的线程我想知道另一point..which是..

  1. 不想要什么,如果同时处理是怎么回事睡觉相机?如果我失去了一些由CameraThread(这在任何情况下,如果我睡觉还是不睡觉的相机,我失去)抓起帧不要紧,对我来说

我使用的QObject每个流程(摄像处理和图像处理作业)和movetoThread命令,使其在一个特定的线程中运行。

关于实施和信号/插槽设计的任何见解将是有益的..

Answer 1:

什么你要找的是一个简单的“发布/订阅”模式。 在这种类型的“分配”的模式,所有的消息被发送,只是客户端下降时,它不是在接收图像的状态

我会实现这个作为你的应用程序如下:

让所有单独的线程(摄像头,加工,GUI),像你已经做的。

(也许,如果你想简单通过qTimer信号)拍摄照片,然后发过来的信号/槽连接到processingThread有peridocally的CameraThread。

当processingThread正在处理的图像,它设置一个状态标志(可以只是一个成员变量,一个布尔值将工作)的说,它的当前处理的图像。 当你完成处理图像您设置的标志说,你不处理。

在processingThreads插槽,这从CameraThread接收的图像,你会先检查,看看是否你目前正在处理的图像。 如果你是,你不与信号数据做任何事情,你可以返回。 如果不处理图像,你将存储的信号数据和呼叫处理功能。

诀窍使这项工作包括这个函数调用 ( QCoreApplication::processEvents()在ProcessingThreads主循环的处理功能。 这将使你的ProcessingThread处理它得到,而它做一些有用的任何信号。

状态变量进行安全检查将允许你“降”发送到您的所有新图像,当你处理当前的一个,而不是排队起来。



文章来源: Implementation of Inter Thread Communication in Qt