【发布时间】:2014-02-18 11:31:48
【问题描述】:
我正在使用基于对话框的应用程序。 我的问题是,我想显示等待对话框,直到执行一些数据库操作。 我使用了 CWinThread 的派生类,但问题是,当这个线程关闭时,背景(主应用程序对话框)保持在停用状态(它隐藏在另一个窗口后面)。 我在想,这是因为 WaitDialog 使用了 CWinThread 类。
【问题讨论】:
标签: visual-c++ mfc
我正在使用基于对话框的应用程序。 我的问题是,我想显示等待对话框,直到执行一些数据库操作。 我使用了 CWinThread 的派生类,但问题是,当这个线程关闭时,背景(主应用程序对话框)保持在停用状态(它隐藏在另一个窗口后面)。 我在想,这是因为 WaitDialog 使用了 CWinThread 类。
【问题讨论】:
标签: visual-c++ mfc
该问题并非基于对话框的应用程序所独有。在多个线程中创建任何类型的窗口都很困难,不推荐使用。在您的情况下,听起来您的等待对话框是模态的,而其父对话框位于另一个线程中。这更糟,可能导致线程之间的死锁。
可靠的解决方案是将等待对话框(和所有其他 GUI)放在主线程中,而将冗长的数据库处理放在辅助线程中。
【讨论】:
另一种选择是使用Modeless Dialogbox,它还可以选择性地显示状态并在数据库操作完成时调用DestroyWindow function——您可能需要在无模式对话框打开时禁用主窗口的某些操作不过可见。
【讨论】:
从我之前回答的 cmets 看来,这种替代方案在这种情况下不可行。
也许更好的方法是创建一个普通的模式“等待”对话框,在对话框的 InitDialog 中启动后台线程,使用计时器定期检查线程的状态,并在线程完成时结束对话框?
【讨论】: