代码之家  ›  专栏  ›  技术社区  ›  aJ.

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

  •  3
  • aJ.  · 技术社区  · 15 年前

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

    我有一个特定的要求,创建一个 Modal 非UI中的对话框(工作线程)。 CDialog 对象和调用 DoModal 2003服务器的行为是,模式对话框放在应用程序主窗口的后面,只有在我单击主窗口时,对话框才会放在前面。它不是我的应用程序的模态对话框。

    有什么问题吗?有什么想法吗?

    AttachThreadInput 但它不起作用。

    4 回复  |  直到 15 年前
        1
  •  2
  •   atzz    15 年前

    首先,我同意其他海报的观点,在主UI线程上显示对话框可能更好。

    1. 创建对话框时将活动窗口作为所有者传递。
    2. 当显示对话框时,遍历其他窗口并执行这些操作 EnableWindow(FALSE) EnableWindow(TRUE) .
    3. 确保在显示对话框时忽略加速器和其他全局命令。

    注意,(2)不应该是必须的,前提是你有(1),但是你提到了MFC,我不记得它的具体行为。它有自己的模式对话框实现,可能与Win32不完全匹配。如果你幸运的话,(1)和(3)就足够了。

        2
  •  2
  •   IInspectable    12 年前

    没有可靠的方法在多个线程之间传播GUI模式。每个窗口都由一个通过 HWND 这反过来又有线程亲和力。这是16位Windows时代的遗留问题,当时没有多线程。因此 不能防止并发访问。 The Old New Thing 1 2 3 Addendum ).

    模态是通过首先启用对话框窗口,然后禁用其父窗口来实现的。第一步是安全的,而第二步尝试从不是窗口所属线程的线程禁用窗口。因为en-/禁用windows会修改通过 HWND公司 它代表一个竞赛条件。

    建议的解决方案是将GUI限制在单个线程中,并从工作线程到GUI线程进行通信,让它代表工作线程执行用户交互。最简单的方法就是打电话 SendMessage 从工作线程到块,直到GUI线程的消息处理程序返回。如果在显示对话框时工作线程应继续运行,则可以使用 PostMessage 而是使用 PostThreadMessage 或者向同步对象发送信号,比如 Event Object .

        3
  •  1
  •   Georg Fritzsche    15 年前

    虽然我不知道Server2003上对话框处理的细节,但在主线程上最简单的解决方法是使用自定义窗口消息do ::SendMessage() 并在消息处理程序中显示对话框。

        4
  •  0
  •   Pavel Radzivilovsky    15 年前