【发布时间】:2017-06-07 20:44:10
【问题描述】:
我们有一个对话框X,可以由不同的线程(也是主线程)以模态方式打开。多个模态X 对话框,可以同时来自不同的线程。
如果主窗口处理SC_CLOSE 消息,我们希望关闭所有X(仅X)模式对话框。
问题是;在主窗口中,当收到SC_CLOSE 消息时,我们如何关闭所有模态X 对话框?只有X!所以,PostQuitMessage 没有帮助,因为它关闭了整个应用程序,我们不想关闭应用程序,如果打开了像 Y, Z ... 这样的其他模式对话框。
信息:主窗口可以处理SC_CLOSE 消息,当我们从主线程也从其他线程打开模态X 对话框时。而X 没有子模态窗口。
【问题讨论】:
-
Is it legal to have a cross-process parent/child or owner/owned window relationship? “是的,这在技术上是合法的。在技术上玩电锯也是合法的。”
-
@IInspectable 我们的对话框就像一个消息框,所以我们没有真正的管理问题。看来我的问题看起来像:link,但我不想关闭
X-dialog。 -
你没有理解这个问题。您正在使用模式对话框,其所有者窗口由另一个线程拥有。仅当您为了安全而专门实施此方案时,才支持此方案。由于您使用的是 MFC,这是不可能的,因为您无权访问消息调度代码。这已融入 MFC 实现。你正在做的事情不安全,也不能保证安全。
-
@IInspectable 你是对的,但总有一些东西我永远无法改变:)。我不能再改变设计了。我正在开发一个已有 20 年历史的软件。直到今天,由于安全,我们从未遇到过问题。看起来,不同的线程显示了一个自定义消息框。也许所有
X-dialogs 都可以以线程安全的方式注册到静态全局集合中,那么我可以关闭这些对话框吗? -
WM_CLOSE是单击关闭按钮时发送的消息,而不是SC_CLOSE。您也可以自己发送。当然,因为你有一个多线程设置,我不确定如果你告诉消息框在任何给定点关闭会发生什么......
标签: c++ multithreading winapi mfc