是否可以在基于对话框的应用程序中从 CWinThread 类派生类

Posted

技术标签:

【中文标题】是否可以在基于对话框的应用程序中从 CWinThread 类派生类【英文标题】:Is it possible to Derive class from CWinThread Class in dialog based application 【发布时间】:2014-02-18 11:31:48 【问题描述】:

我正在使用基于对话框的应用程序。 我的问题是,我想显示等待对话框,直到执行一些数据库操作。 我使用了 CWinThread 的派生类,但问题是,当这个线程关闭时,背景(主应用程序对话框)保持在停用状态(它隐藏在另一个窗口后面)。 我在想,这是因为 WaitDialog 使用了 CWinThread 类。

【问题讨论】:

【参考方案1】:

该问题并非基于对话框的应用程序所独有。在多个线程中创建任何类型的窗口都很困难,不推荐使用。在您的情况下,听起来您的等待对话框是模态的,而其父对话框位于另一个线程中。这更糟,可能导致线程之间的死锁。

可靠的解决方案是将等待对话框(和所有其他 GUI)放在主线程中,而将冗长的数据库处理放在辅助线程中。

【讨论】:

【参考方案2】:

另一种选择是使用Modeless Dialogbox,它还可以选择性地显示状态并在数据库操作完成时调用DestroyWindow function——您可能需要在无模式对话框打开时禁用主窗口的某些操作不过可见。

【讨论】:

你能告诉我哪个选项.. 因为,我以前使用过无模型对话框,实现从 CWinThread 派生的类,但问题是,如果我们在处理过程中单击主对话框,它显示不是在应用程序崩溃时响应给予选项,等待或关闭应用程序。 您需要为无模式对话框的 HWND 设置一个 HWND 变量(全局变量或 CDialog 派生类中的成员变量),并防止用户单击如果此 HWND 不为 NULL,则主对话框 我尝试了您建议的方法,该方法要求无模型对话框,我还限制所有按钮单击,它工作正常,直到后台处理完成剩余几毫秒,如果我们点击任何地方(主对话框或等待对话框),而所有后台处理完成只剩下几毫秒。 您是在等待后台线程完成后再销毁无模式对话框吗? 是的,处理完成后,我销毁无模型对话框,并为单击时使用的窗口句柄分配null。【参考方案3】:

从我之前回答的 cmets 看来,这种替代方案在这种情况下不可行。

也许更好的方法是创建一个普通的模式“等待”对话框,在对话框的 InitDialog 中启动后台线程,使用计时器定期检查线程的状态,并在线程完成时结束对话框?

【讨论】:

以上是关于是否可以在基于对话框的应用程序中从 CWinThread 类派生类的主要内容,如果未能解决你的问题,请参考以下文章

在 SDI mfc 应用程序中从视图访问模式对话框

准备好 Dialog ViewModel 绑定,调用 Dialog 并在 MVVM 中从它返回数据

如何在自适应对话框 HttpRequest 中从 xml 转换为 json?

是否可以在 QWebView 中从 JavaScript 调用 C++ 函数?

CMenu 和基于对话框的应用程序

如何在 Java 程序中从 IdP-ADFS 获取用户?