Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt中线程间通信的实现_C++_Multithreading_Qt_Qthread_Qt5 - Fatal编程技术网

C++ Qt中线程间通信的实现

C++ Qt中线程间通信的实现,c++,multithreading,qt,qthread,qt5,C++,Multithreading,Qt,Qthread,Qt5,我在实现以下场景时遇到问题。我的问题陈述如下: 我有三条线。ThreadCamera用于从相机抓取帧。ThreadProcess for processing(使用OpenCV对图像/帧进行一些图像处理)用于显示图像的帧和主GUI线程 我不知道ThreadProcess处理图像需要多少时间。所以我想将图像从ThreadCamera传递到ThreadProcess,对图像进行一些图像处理,并将其传递到主GUI线程进行显示 当ThreadProcess处理图像时,ThreadCamera应该休眠。也

我在实现以下场景时遇到问题。我的问题陈述如下:

  • 我有三条线。ThreadCamera用于从相机抓取帧。ThreadProcess for processing(使用OpenCV对图像/帧进行一些图像处理)用于显示图像的帧和主GUI线程
  • 我不知道ThreadProcess处理图像需要多少时间。所以我想将图像从ThreadCamera传递到ThreadProcess,对图像进行一些图像处理,并将其传递到主GUI线程进行显示
  • 当ThreadProcess处理图像时,ThreadCamera应该休眠。也就是说,它不应该从相机上抓取更多的帧。当ThreadProcess完成图像处理任务时,它应该将图像和一些信息传递给主GUI线程。在此之后,只有ThreadCamera会醒来并从该(ThreadCamera)线程中运行的相机中抓取下一帧/图像
  • Thanx伙计们…在发表了一些评论之后,我想知道另一点…那就是

  • 如果在处理过程中不想让相机休眠该怎么办?如果我松开CameraThread抓取的一些帧对我来说并不重要(在任何情况下,如果我休眠或不休眠相机,我都会松开这些帧)
  • 我为每个进程(相机进程和图像处理作业)使用QObject,并使用movetoThread命令使其在特定线程中运行


    任何关于实现和信号/插槽设计的见解都会很有帮助。

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

    我将在您的应用程序中执行以下操作:

    像你已经做的那样,拥有所有独立的线程(摄像头、处理、Gui)

    让CameraThread peridocally(如果您想让它变得简单的话,可以通过qTimer信号)捕获一个图像,并通过信号/插槽连接将其发送到processingThread

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

    在processingThreads插槽中,从CameraThread接收图像,首先检查当前是否正在处理图像。如果是,则不处理信号数据,只返回。如果不处理图像,则将存储信号数据并调用处理函数

    实现此功能的诀窍是将此(
    QCoreApplication::processEvents()
    )包含在处理函数的ProcessingThreads主循环中。这将允许ProcessingThread在执行某些有用的操作时处理它收到的任何信号


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

    如果有两个线程不应该同时工作。。。你的线程太多了。只在这两个线程上运行会消除大部分问题。如果相机总是等待处理,为什么不在相机和图像处理中使用一个线程呢?节省了同步问题,因为您可以一次完成所有任务。@Mat…是的…但是图像处理任务很繁重…所以我想把它放在另一个线程中…您认为它应该放在一个线程中是正确的。但是,如果在处理运行时捕获处于休眠状态,为什么您觉得它需要与捕获分离?如果处理后的图像是您希望在GUI中显示的唯一内容,那么您就不需要捕获未处理的图像,这将占用更多的CPU资源。这样做还允许您将其他线程(如果您试图对同一摄像头信号进行某种图像捕获/记录/分析)注册到同一摄像头信号,而不会限制其帧速率或真正丢失数据。图像的处理和显示需要时间,但其他背景线程可以处理相同的精确图像数据,并可能对其进行一些有用的处理。