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应该休眠。也
任何关于实现和信号/插槽设计的见解都会很有帮助。您需要的是一个简单的“发布/订阅”模式。在这种类型的“分发”模式中,当客户端不处于接收图像的状态时,所有消息都由客户端发送和删除 我将在您的应用程序中执行以下操作: 像你已经做的那样,拥有所有独立的线程(摄像头、处理、Gui) 让CameraThread peridocally(如果您想让它变得简单的话,可以通过qTimer信号)捕获一个图像,并通过信号/插槽连接将其发送到processingThread 当processingThread处理图像时,它设置一个状态标志(可以只是一个成员变量,bool可以工作)来表示它当前正在处理图像。处理完图像后,设置标志表示未处理 在processingThreads插槽中,从CameraThread接收图像,首先检查当前是否正在处理图像。如果是,则不处理信号数据,只返回。如果不处理图像,则将存储信号数据并调用处理函数 实现此功能的诀窍是将此(
QCoreApplication::processEvents()
)包含在处理函数的ProcessingThreads主循环中。这将允许ProcessingThread在执行某些有用的操作时处理它收到的任何信号
状态变量检查将允许您在处理当前图像时“删除”发送给您的所有新图像,而不是将它们排队 如果有两个线程不应该同时工作。。。你的线程太多了。只在这两个线程上运行会消除大部分问题。如果相机总是等待处理,为什么不在相机和图像处理中使用一个线程呢?节省了同步问题,因为您可以一次完成所有任务。@Mat…是的…但是图像处理任务很繁重…所以我想把它放在另一个线程中…您认为它应该放在一个线程中是正确的。但是,如果在处理运行时捕获处于休眠状态,为什么您觉得它需要与捕获分离?如果处理后的图像是您希望在GUI中显示的唯一内容,那么您就不需要捕获未处理的图像,这将占用更多的CPU资源。这样做还允许您将其他线程(如果您试图对同一摄像头信号进行某种图像捕获/记录/分析)注册到同一摄像头信号,而不会限制其帧速率或真正丢失数据。图像的处理和显示需要时间,但其他背景线程可以处理相同的精确图像数据,并可能对其进行一些有用的处理。