我在实施以下方案时遇到问题.我的问题陈述如下:
>我有3个线程. ThreadCamera用于从相机抓取帧.用于处理(获取的图像/帧的OpenCV进行一些图像处理)帧和显示图像的主GUI线程的ThreadProcess.
>我不知道ThreadProcess将花费多少时间来处理图像.所以我想将图像从ThreadCamera传递给ThreadProcess,对图像进行一些图像处理,然后将其传递给主GUI线程进行显示.
>当ThreadProcess处理图像时,ThreadCamera应该休眠.即它不应从相机中抓取更多的帧.当ThreadProcess完成图像处理任务时,它将图像和一些信息传递给主GUI线程.此后,只有ThreadCamera应该醒来,并从该(ThreadCamera)线程的相机行拍中获取下一帧/图像.
Thanx Guys …经过一番评论,将“相机和图像处理”工作放到了一个线程中,我想知道另一点..
>如果在处理正在进行时不想睡觉,该怎么办?我放开CameraThread抓取的一些帧对我来说没关系(无论如何我睡觉还是不睡觉都在丢失相机)
我为每个进程(相机进程和图像处理作业)使用QObject,并使用movetoThread命令使其在特定线程中运行.
关于实现和信号/插槽设计的任何见解都将有所帮助.
解决方法:
您正在寻找的是一个简单的“发布/订阅”模式.在这种“分发”模式中,所有消息都在客户端未处于接收图像状态时发送并丢弃
我将在您的应用程序中实现以下内容:
像您已经拥有的那样,拥有所有单独的线程(相机,处理,Gui).
让CameraThread定期(通过qTimer信号,如果您想使其更简单)捕获图像,并通过信号/插槽连接将其发送到processingThread.
当processingThread处理图像时,它会设置一个状态标志(可以只是一个成员变量,布尔值将起作用),以表示其当前正在处理图像.处理完图像后,将标志设置为未处理.
在从CameraThread接收图像的processingThreads插槽中,您将首先检查是否正在处理图像.如果是,则对信号数据不执行任何操作,然后返回即可.如果不处理图像,则将存储信号数据并调用处理功能.
进行此工作的技巧是在处理函数的ProcessingThreads主循环中包含此function call(QCoreApplication :: processEvents()).这将允许您的ProcessingThread处理它正在做的有用事情时得到的所有信号.
通过状态变量检查,您可以在处理当前图像时“丢弃”发送给您的所有新图像,而无需排队.