提问人:Tabasco 提问时间:5/10/2022 最后编辑:Tabasco 更新时间:5/10/2022 访问量:131
将控制台程序转换为 MFC 应用(线程问题)(Pleora SDK)
Converting a Console Program into an MFC app (Thread issues) (Pleora SDK)
问:
在我自己的尝试了几个小时后,带着另一个问题回到stackoverflow哈哈。 感谢大家阅读本文并提前提供帮助。
请注意,控制台程序具有以下功能:
- 连接到图像采集卡
- 应用一些配置
- 将传入数据(640 * 480 16 位灰度图像)存储在 while 循环内的缓冲区流中
- 按下按键后退出 while 循环。
- 断开与设备的连接
我只在 MFC GUI 应用程序上添加了显示图像功能。总之
i) 将控制台应用转换为 MFC 应用(基于对话框)
ii) 决定使用 thread 来显示图像,但是在退出线程之前,当有某些任务需要完成时(例如调用 disconnectFromDevice(); freeBuffers(); 等),DK 如何正确退出线程。
iii) 尝试将 while 循环条件设为 false,但没有奏效 (我实际上希望这是一个重复调用的回调函数,但 IDK 如何在线程中实现它)
iv) 强制 AfxEndThread 不起作用,这甚至不是应该做的方式(我认为)。
所以我的问题是,
1. 你是否应该使用 while 循环来催出应该重复完成的某个工作?如果没有,是否必须在线程内实现回调?还是使用 Windows 消息循环?为什么以及如何?请提供一个类似 hello-world 的示例代码示例
(例如,在 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()
工作线程可以作为循环实现。循环可以根据各种条件终止,例如无法检索用户的任何数据或请求。您可以简单地退出线程过程以终止线程的执行。如果线程没有响应,它可能已卡住(除非它执行非常冗长的操作),并且 UI 线程必须提供某种机制来终止它。这是第一个请求终止,如果它在设定的时间内没有响应,则终止它。
终止的条件机制最好是一些同步对象(我建议手动重置事件)、互锁变量或简单的布尔值,您应该使用临界部分访问和设置它们。
一些注意事项:
- 将参数块传递给线程。确保它在线程的整个生命周期内保持活动状态。例如,它不应该是在线程终止之前退出的函数中的局部变量。
- 循环必须是“高效”的,即如果数据不可用,则不要无限循环。如果可用,请考虑使用带有超时的阻塞函数。
- 资源管理(例如连接/断开连接、分配/释放等)最好由同一线程执行。
另一种实现可以是 APC。然后线程的 proc 函数是一个循环,其他线程使用 the 函数发出请求。while(!bTerminate) { SleepEx(INFINITE, TRUE); }
QueueUserAPC()
调用是错误的,它会终止当前线程,在本例中为主 (UI) 线程。查看文档。AfxEndThread(0)
OnBnClickedDisconnectButton()
顺便说一句,我对项目类型的建议不是基于对话框的应用程序,而是一个没有文档类的普通 MFC 应用程序(取消选中文档/视图体系结构支持选项),因为它提供了菜单、工具栏等功能,最重要的是处理程序。ON_UPDATE_COMMAND_UI
评论
while