繁体   English   中英

将控制台程序转换为 MFC 应用程序(线程问题)(Pleora SDK)

[英]Converting a Console Program into an MFC app (Thread issues) (Pleora SDK)

在我自己尝试了几个小时后回到 stackoverflow 并提出另一个问题,哈哈。 感谢大家阅读本文并提前提供帮助。

请注意控制台程序具有以下功能:

  1. 连接到图像采集卡
  2. 应用一些配置
  3. 将传入数据(640 * 480 16 位灰度图像)存储在 while 循环内的缓冲区流中
  4. 按键时退出 while 循环。
  5. 与设备断开连接

而且我只是在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM