Qt中的线程间通信的实现

时间:2012-12-09 16:38:18

标签: c++ multithreading qt qthread qt5

我在实施以下方案时遇到问题。我的问题陈述是这样的:

  1. 我有3个主题。 ThreadCamera用于从相机中抓取帧。 ThreadProcess用于处理(在抓取的图像/帧上使用OpenCV进行一些图像处理)框架和用于显示图像的主GUI线程。
  2. 我不知道ThreadProcess处理图像需要多长时间。所以我想将图像从ThreadCamera传递给ThreadProcess,对图像进行一些图像处理并将其传递给主GUI线程进行显示。
  3. 当ThreadProcess处理图像时,T​​hreadCamera应该睡眠。即它不应该从相机中获取更多帧。当ThreadProcess完成图像处理任务时,它应该将图像和一些信息传递给主GUI线程。在此之后,只有ThreadCamera应该唤醒并从该(ThreadCamera)线程中的相机runnig中获取下一帧/图像。
  4. Thanx Guys ...经过一些评论将相机和图像处理工作放在一个线程中后,我想知道另一个问题..这是......

    1. 如果在处理过程中不想让相机睡觉怎么办?如果我松开了CameraThread抓取的一些帧,这对我来说无关紧要(无论如何,如果我睡不着,我会失去它不要睡觉相机)
    2. 我在每个进程(Camera Process and Image Processing job)和movetoThread命令中使用QObject,使其在特定的线程中运行。

      有关实施和信号/插槽设计的任何见解都会有所帮助..

1 个答案:

答案 0 :(得分:2)

您正在寻找的是一种简单的“发布/订阅”模式。在这种类型的“分发”模式中,当客户端不处于接收图像的状态时,所有消息都被发送并且被客户端删除

我会在您的应用程序中实现以下内容:

像你一样拥有所有单独的线程(Camera,Processing,Gui)。

通过peridocally(通过qTimer信号可能,如果你想简化)摄像头,捕获图像并通过信号/插槽连接发送到processingThread。

当processingThread处理图像时,它设置一个状态标志(可以只是一个成员变量,一个bool可以工作)来表示它当前正在处理一个图像。处理完图像后,设置标记表示您没有处理。

在ProcessingThreads插槽中,它接收来自CameraThread的图像,您将首先检查您当前是否正在处理图像。如果你是,你不对信号数据做任何事情,你只需返回。如果您不处理图像,则将存储信号数据并调用过程函数。

使这项工作的诀窍是在处理函数的ProcessingThreads主循环中包含此function callQCoreApplication::processEvents())。这将允许您的ProcessingThread处理它所做的任何信号,而它正在做一些有用的事情。

状态变量检查将允许您“丢弃”在处理当前的图像时发送给您的所有新图像,而不是将它们排队。