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

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

提问人:Tabasco 提问时间:5/10/2022 最后编辑:Tabasco 更新时间:5/10/2022 访问量:131

问:

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

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

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

我只在 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

C++ 多线程回 MFC DialogBasedApp

评论

0赞 IInspectable 5/10/2022
“砰!它引发未加载的 wntdll.pdb。有时不同的 pdbs。- 这很不幸,尽管不是你的代码问题。它是调试器,让您知道它无法加载特定模块的符号信息。至于重复执行代码,这正是循环的用途。您可以使用其条件结束循环。您可以使用同步对象或任何其他合适的同步原语。while

答:

0赞 Constantine Georgiou 5/10/2022 #1

工作线程没有消息队列,(通常只有一个)UI 线程有消息队列。线程的消息队列由函数的第一次调用创建。为什么要使用消息来控制工作线程中的处理?您必须为此建立一个特殊的协议,定义自定义消息并将它们发布到队列中。GetMessage()

工作线程可以作为循环实现。循环可以根据各种条件终止,例如无法检索用户的任何数据或请求。您可以简单地退出线程过程以终止线程的执行。如果线程没有响应,它可能已卡住(除非它执行非常冗长的操作),并且 UI 线程必须提供某种机制来终止它。这是第一个请求终止,如果它在设定的时间内没有响应,则终止它。

终止的条件机制最好是一些同步对象(我建议手动重置事件)、互锁变量或简单的布尔值,您应该使用临界部分访问和设置它们。

一些注意事项:

  • 将参数块传递给线程。确保它在线程的整个生命周期内保持活动状态。例如,它不应该是在线程终止之前退出的函数中的局部变量。
  • 循环必须是“高效”的,即如果数据不可用,则不要无限循环。如果可用,请考虑使用带有超时的阻塞函数。
  • 资源管理(例如连接/断开连接、分配/释放等)最好由同一线程执行。

另一种实现可以是 APC。然后线程的 proc 函数是一个循环,其他线程使用 the 函数发出请求。while(!bTerminate) { SleepEx(INFINITE, TRUE); }QueueUserAPC()

调用是错误的,它会终止当前线程,在本例中为主 (UI) 线程。查看文档AfxEndThread(0)OnBnClickedDisconnectButton()

顺便说一句,我对项目类型的建议不是基于对话框的应用程序,而是一个没有文档类的普通 MFC 应用程序(取消选中文档/视图体系结构支持选项),因为它提供了菜单、工具栏等功能,最重要的是处理程序。ON_UPDATE_COMMAND_UI

评论

0赞 Tabasco 5/11/2022
while(1) {vote++;} 对于这个彻底的答案。我认为没有人能更好地解释这一点。非常感谢。