什么可能导致 wxFrame::Destroy() 不破坏任何东西?

What may cause wxFrame::Destroy() to not to destroy anything?

我完全知道我的问题没有明确的解决方案,这就是为什么我不问为什么它不起作用,而是问当前实现的预期行为是什么 is/how指定工作:

我有一个 wxFrame 派生的 class,其中包含很多子 GUI 元素。在关闭时 wxFrame::Destroy() 被调用,我不仅在我的 wxFrame 派生的 class 的析构函数中结束,而且在所有这些子元素的析构函数中结束。在这种情况下,我的所有 windows 都已关闭并且应用程序正常退出。

现在在某些情况下这不起作用:我可以单步执行 wxFrame::Destroy(),它与往常一样,但之后没有调用析构函数,应用程序保持活动状态并可见。在这种情况下,我可以尝试 close/call wxFrame::Destroy() 几次,结果始终相同,应用程序保持活动状态并且所有 windows 仍然可见且可用。

我个人猜测,这与我的一个子元素有关,但我不知道 one/what 会导致此行为。

所以我的问题是:wxFrame::Destroy() 打算如何工作,在什么条件下它会拒绝这样的调用并且不会破坏相关的 wxFrame?

wxFrame::Destroy() 不会立即销毁 window,它只是将其标记为删除,这实际上将在下一次消息循环迭代期间发生,在处理完所有未决消息之后(这很重要因为其中一些未决消息可能有处理程序引用即将被删除的帧)。因此,对于您所描述的这个问题,最常见的解释是有些东西生成事件的速度比处理事件的速度快,因此消息循环永远不会空闲。

例如,在旧版本的 wxWidgets 中,如果您没有正确重绘所有 windows,即没有创建 [=12],MSW 下的 wxEVT_PAINT 事件可能会发生这种情况=] 在你的油漆处理程序中。 wxWidgets 3 已经添加了一些解决方法来防止这种情况发生,但仍然可能发生稍微复杂一些的事情。

要对此进行调试,运行 Spy++ 应用程序可能很有用,并检查您是否看到 Windows 消息永无止境地流向您的应用程序 windows。