wxWidgets wxMessageDialog 在辅助线程中运行良好,而自定义对话框则不行

wxWidgets wxMessageDialog works well in a secondary thread while a custom dialog doesn't

我正在 Windows 11 上使用 C++ /CLI 和 wxWidgets 进行编程。

我也在使用 .NET 线程


当我在辅助线程中创建 wxMessageDialog 和 运行 ->ShowModal() 时,它起作用了。

但是当我在辅助线程中创建自定义对话框时,运行ning ->ShowModal() 弹出一个 wxWidgets 调试警报 window :

我尝试在 wxWidgets forum 上搜索相同的问题,但找不到。我发现了类似的问题,但其中 none 解决了我的问题。

我还尝试用对 wxMutexGuiEnter();wxMutexGuiLeave(); 的调用包围 MyCustomDialog->ShowModal() ,但这也没有用。

我在浏览论坛时也了解了 wxThread,但如果 wxMessageDialog 可以工作而无需我创建 wxThread,我就不必自己创建 wxThread。


我知道我不应该从辅助线程调用 GUI 方法,但是 wxMessageDialogShowModal() 没有问题。

我想知道 wxMessageDialog 是如何工作的,以及我是否可以用我的自定义对话框实现相同的功能。

谢谢。

简而言之,没有办法在当前实现和可预见的未来使用来自辅助线程的自定义对话框

即使您当前的代码今天可以使用 wxMessageDialog,也不能保证它明天会继续工作,或者在不同的 Windows 版本或其他 OS 上继续工作。

更多细节:

  • wxMessageDialog 和自定义对话框在内部明显不同,尽管它们代表相似的 UI 功能。
  • wxMessageDialog 具有 本机实现 ,您可以在 src/msw/msgdlg.cpp.
  • 中找到它的 wxMessageDialog::ShowModal() 实现
  • 自定义对话框将由 wxWidgets 代码组装成 运行,即使对话框本身和其他组件是本机小部件。您可以在 src/msw/dialog.cpp.
  • 中找到 wxDialog::ShowModal()

如果你真的想进行一些实验性的开发(因为它仍然不适合其他任何东西),并且在 Win 11 上,你可以尝试 wxRichMessageDialog。它提供了比 wxMessageDialog 更多的功能,并且在 Vista 和更高版本上它具有本机实现,这可能与您的“hack”一起使用。

但同样,从辅助线程使用 UI 迟早会导致死胡同。