[英]Converting a Console Program into an MFC app (Thread issues) (Pleora SDK)
在我自己尝试了几个小时后回到 stackoverflow 并提出另一个问题,哈哈。 感谢大家阅读本文并提前提供帮助。
请注意控制台程序具有以下功能:
- 连接到图像采集卡
- 应用一些配置
- 将传入数据(640 * 480 16 位灰度图像)存储在 while 循环内的缓冲区流中
- 按键时退出 while 循环。
- 与设备断开连接
而且我只是在 MFC GUI 应用程序上添加显示图像功能。 简而言之,
i) 将控制台应用程序转换为 MFC 应用程序(基于对话框)
ii) 决定使用线程来显示图像,但是在退出线程之前,当有某些任务要完成(例如调用 disconnectFromDevice(); freeBuffers(); 等)时,DK 如何正确退出线程。
iii)尝试使while循环条件为false但没有用(我实际上希望这是一个反复调用的回调函数,但IDK如何在线程中实现它)
iv)强制 AfxEndThread 不起作用,甚至不是应该做的方式(我认为)。
所以我的问题是,
1. 您是否应该使用 while 循环来执行某个应该重复完成的工作? 如果没有,您是否必须在线程内实现回调? 还是使用 Windows 消息循环? 为什么以及如何? 请提供一个 hello-world-like 示例代码示例
(例如,您在 MFC GUI 应用程序中使用条件在线程内重复打印“hello world”。如果您不能只在 threadproc 中使用 AfxEndThread(),您如何更新或检查结束线程的条件)
2.如果while没问题,如何退出while循环,换句话说,如何正确更新while循环所在线程外的退出条件?
请参考提供的链接中的源代码
ctrl+F OnBnClickedConnectButton、AcquireImages 和 OnBnClickedDisconnectButton
https://github.com/MetaCortex728/img_processing/blob/main/IR140Dlg.cpp
工作线程没有消息队列,(通常只有一个)UI 有。 线程的消息队列由第一次调用GetMessage()
函数创建。 为什么使用消息来控制工作线程中的处理? 您必须为此建立一个特殊的协议,定义自定义消息并将它们发布到队列中。
工作线程可以实现为循环。 循环可以根据各种条件终止,例如无法从用户检索任何数据或请求。 您可以简单地退出线程 proc 以终止线程的执行。 如果线程没有响应,它可能已经卡住了(除非它执行了一个非常长的操作)并且 UI 线程必须提供一些机制来杀死它。 那是第一次请求终止,如果它在某个设定的时间内没有响应,则将其终止。
终止的条件机制最好是一些同步对象(我建议手动重置事件)、互锁变量或一个简单的布尔值,您应该使用临界区访问和设置。
一些考虑:
另一种实现方式可以是 APC。 那么线程的proc函数就是while(!bTerminate) { SleepEx(INFINITE, TRUE); }
while(!bTerminate) { SleepEx(INFINITE, TRUE); }
循环,其他线程使用QueueUserAPC()
函数发出请求。
OnBnClickedDisconnectButton()
中的AfxEndThread(0)
调用是错误的,它终止了当前线程,在本例中是主 (UI) 线程。 检查文档。
旁注,我对项目类型的建议不是基于对话框的应用程序,而是没有文档类的普通 MFC 应用程序(取消选中 Document/View 体系结构支持选项),因为它提供菜单、工具栏等功能,并且最重要的是ON_UPDATE_COMMAND_UI
处理程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.