wxWidgets应用程序在尝试启动新对话框时冻结

wxWidgets application freezes when trying to start new dialog

本文关键字:对话框 冻结 启动 应用程序 wxWidgets      更新时间:2023-10-16

我正在开发一个wxWidgets应用程序,我正在尝试创建一个回调,它将显示对话框给出在我的自定义事件类作为指针动态创建的对话框对象。这样做的原因是我想要一个回调,它将启动任何对话框/窗口,而不知道对话框的确切类。

为此,我需要从主线程(例如回调函数)显示对话框,否则程序会遇到错误(在某些条件下它仍然运行,但通知用户它不是启动新窗口的正确方式)。

所以我创建了一个新的对话框,将它分配给我的自定义事件,并将事件排队到主窗口。

wxDialog *dialog = new TelemetryDialog(MainWindow::mInstance);
DialogEvent *event = new DialogEvent(EVENT_DIALOG_SHOW, dialog);
MainWindow::mInstance->m_eventHandler->QueueEvent(*event);

then in callback function:

wxDialog *dialog = event.getDialog();
if (dialog != NULL)
{
    dialog->Show(true);
}

对话框显示为空,程序冻结。但是如果我像这样使用回调函数:

wxDialog *dialog = new TelemetryDialog(this);
dialog->Show();

很好。我一直在考虑克隆对话框对象,但这是不可能的(基类的复制构造函数是私有的)。

以前有人尝试过这样的东西吗?这可能吗?

我怀疑在工作线程中调用对话框构造函数是不允许的!

无论确切的问题是什么,我建议在主线程中做所有GUI的东西会更安全。这样的:

在自定义事件中,传递枚举整数。然后,在回调函数中,使用switch语句来构造并显示所需的对话框。

switch ( event.getDialogType() ) {
case TelemetryDialogType:
  dialog = new TelemetryDialog(MainWindow::mInstance);
  break;
...
}
dialog->Show(true);