在工作线程完成 MFC 时禁用控制变量

Posted

技术标签:

【中文标题】在工作线程完成 MFC 时禁用控制变量【英文标题】:Disabling control variable while worker thread is finishing MFC 【发布时间】:2015-11-22 10:03:42 【问题描述】:

我正在使用 Visual Studio 2015 开发基于对话框的 MFC 应用程序。基本上我的问题是我有一个按钮,在用户选择了必要的输入(将被解析和放入不同的向量中)。为了避免复杂化,我决定用户在工作线程完成计算之前不能按下这个按钮或输入按钮。我尝试了 WaitforSingleObject 选项,但没有达到在等待工作线程完成时保持主线程或 MFC 应用程序运行的目的。是否有任何其他解决方法可以解决此问题?感谢您的帮助。

【问题讨论】:

您能否说明您正在解决问题的哪一部分:禁用按钮,或者知道工作线程已经启动/完成? 我可以禁用按钮,但在工作线程完成时同步它们是我的问题。就像我只会在工作线程完成后启用它们。除了 WaitforSingleObject,我还尝试获取工作线程的返回值,但这涉及将按钮的启用放入 while 循环中,这基本上是 WaitforSingleObject 函数。 我认为 Neil 从工作线程发布消息的想法是最合适的部分。 【参考方案1】:

您的工作线程可以将完成消息发回您的 UI 线程。在这种情况下,您的 UI 线程不需要特殊的消息循环,而是您的窗口过程会在收到该消息时重新启用按钮。

【讨论】:

这是我的想法。 +1。 我没想到是这个解决方案。会试试这个。谢谢! 除此建议外,您还可以创建一个显示进度的模式对话框。这样您就不必手动禁用和重新启用按钮控件。模态对话框在显示时禁用其所有者窗口,并在销毁时启用所有者。【参考方案2】:

您可以使用MsgWaitForMultipleObjects 函数: https://msdn.microsoft.com/en-us/library/windows/desktop/ms684242(v=vs.85).aspx

ATL 在 AtlWaitWithMessageLoop(https://msdn.microsoft.com/en-us/library/26hwk2bx.aspx) 中使用它。

【讨论】:

谢谢,我会调查这个答案。 不,你不能。消息循环已融入 MFC 框架,无法更改。

以上是关于在工作线程完成 MFC 时禁用控制变量的主要内容,如果未能解决你的问题,请参考以下文章

MFC主线程等待另一个线程结束

MFC禁用关闭按钮

工作线程中的同步与异步 ioctl

安全终止MFC线程

MFC:在工作线程中使用对象的成员函数时出现访问冲突错误

MFC 线程创建方式