Qt.中线程间通信的实现
Implementation of Inter Thread Communication in Qt
我在实现以下场景时遇到问题。我的问题陈述如下:
- 我有3个线程。ThreadCamera从相机中抓取帧。ThreadProcess用于处理(使用OpenCV对抓取的图像/帧进行一些图像处理)帧和用于显示图像的主GUI线程
- 我不知道ThreadProcess处理一个图像需要多少时间。因此,我想将图像从ThreadCamera传递给ThreadProcess,对图像进行一些图像处理,并将其传递给主GUI线程进行显示
- ThreadProcess处理图像时,ThreadCamera应处于休眠状态。也就是说,它不应该从相机抓取更多的帧。当ThreadProcess完成图像处理任务时,它应该将图像和一些信息传递给主GUI线程。在这之后,只有ThreadCamera应该唤醒并从该(ThreadCamera)线程中运行的相机中获取下一帧/图像
谢谢各位。。。在评论了一些将相机和图像处理工作放在一个线程中之后,我想知道另一点。。是..
- 如果在处理过程中不想让相机休眠怎么办?如果我松开了CameraThread抓取的一些相框,对我来说并不重要(在任何情况下,如果我睡觉或不睡觉,我都会松开)
我为每个进程(相机进程和图像处理作业)使用QObject,并使用movetoThread命令使其在特定线程中运行。
任何关于实现和信号/插槽设计的见解都将有所帮助。。
您想要的是一个简单的"发布/订阅"模式。在这种类型的"分发"模式中,当客户端不处于接收图像的状态时,所有消息都会被发送并丢弃
我将在您的应用程序中实现如下:
拥有所有独立的线程(相机,处理,桂),就像你已经做了
让CameraThread周期性地(通过qTimer信号,如果你想让它变得简单的话)捕获一个图像,并通过信号/插槽连接将其发送到processingThread。
当processingThread处理图像时,它会设置一个状态标志(可以只是一个成员变量,bool也可以)来表示它当前正在处理图像。当你处理完图像后,你会设置标志表示你没有处理。
在从CameraThread接收图像的processingThreads插槽中,您将首先检查当前是否正在处理图像。如果是,则不处理信号数据,只返回。如果您不处理图像,您将存储信号数据并调用处理函数。
实现此功能的诀窍是将此函数调用(QCoreApplication::processEvents()
)包含在处理函数的ProcessingThreads主循环中。这将允许ProcessingThread在做有用的事情时处理它得到的任何信号。
状态变量检查将允许您在处理当前图像时"删除"发送给您的所有新图像,而不将它们排队。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 如何使用winsock在c++应用程序中实现安全套接字通信
- 如何实现MATLAB和单独的C++应用程序之间的通信
- Qt.中线程间通信的实现
- 用c++实现TCP/Ip网络通信
- 是否有在C++和Javascript中实现的高级进程间通信API
- 在 Windows 上的 C++ 中实现强大、简单(且快速)的进程间通信
- 基于套接字的通信独立于用于实现它的编程语言.怎么可能
- 用C++实现与AutoCAD的链接和通信
- 使用多个线程在C++中实现客户端软件和服务器软件之间的通信
- C++用线程间通信实现线程
- 我可以使用JSON在用不同编程语言实现的进程之间进行通信吗
- 使用Java实现服务器应用程序和Matlab客户端之间的套接字通信
- 如何在一个套接字上实现并行请求和响应的非阻塞客户端-服务器通信模型,而不存在数据竞争
- c++实现的一个邮箱,用于线程间通信
- 用c++实现pc机与arduino之间的RS232串行通信
- 如何在Windows上实现c++和PHP之间的通信
- 实现主c++程序与嵌入式ECL之间的通信