如何在工作线程(非 UI 线程)中创建模态对话框?

2023-12-29

我编写了一个示例 MFC 应用程序,其中有两个线程: - 主线程(UI线程) -工作线程(非UI线程)

我有一个特定的要求来创建一个Modal非 UI(工作线程)中的对话框。 当我创建CDialog对象和调用DoModal同样,它有效。该对话框被创建并充当应用程序的模式。 (Win XP SP2 机器)但这在 Windows 2003 服务器机器上不起作用。 2003 服务器中的行为是,模态对话框位于应用程序主窗口后面,只有当我单击主窗口时,对话框才会显示在前面。它不充当我的应用程序的模式对话框。

可能是什么问题——有什么想法吗?

如果在非 UI 线程中创建 UI 控件是问题,那么是否有任何 Win32 API 允许我将我的工作线程链接到主 UI 线程,以便DoModal发生在主线程中。我试过附加线程输入 http://msdn.microsoft.com/en-us/library/ms681956(VS.85).aspx但它不起作用。


没有可靠的方法可以跨多个线程传播 GUI 模式。每个窗口都由通过引用的对象表示HWND这又具有线程亲和力。这是 Windows 16 位时代的遗留问题,当时还没有多线程。因此HWNDs 不受并发访问保护。旧事新事 http://blogs.msdn.com/b/oldnewthing/有一个关于“用户界面对象的线程亲和性”的优秀系列(部分1 http://blogs.msdn.com/b/oldnewthing/archive/2005/10/10/479124.aspx 2 http://blogs.msdn.com/b/oldnewthing/archive/2005/10/11/479587.aspx 3 http://blogs.msdn.com/b/oldnewthing/archive/2005/10/12/480064.aspx Addendum http://blogs.msdn.com/b/oldnewthing/archive/2012/11/09/10367057.aspx).

模态是通过首先启用对话框窗口然后禁用其父窗口来实现的。第一步是安全的,而第二步尝试从不是窗口所属线程的线程禁用窗口。由于启用/禁用窗口会修改通过HWND它代表一种竞争条件。

建议的解决方案是将 GUI 限制为单个线程,并从工作线程到 GUI 线程进行通信,以使其代表工作线程执行用户交互。完成此操作的最简单方法是调用发信息 http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950.aspx从工作线程阻塞直到 GUI 线程的消息处理程序返回。如果工作线程在显示对话框时继续运行,您可以使用留言 http://msdn.microsoft.com/en-us/library/windows/desktop/ms644944.aspx相反,并使用以下方式与工作线程通信帖子主题消息 http://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx或发信号通知同步对象,例如事件对象 http://msdn.microsoft.com/en-us/library/windows/desktop/ms686915.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在工作线程(非 UI 线程)中创建模态对话框? 的相关文章

随机推荐