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

时间:2013-03-08 14:29:28

标签: c++ wxwidgets

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

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

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

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

然后在回调函数中:

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

接下来发生的事情是对话框显示为空并且程序冻结。 但是,如果我使用这样的回调函数:

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

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

之前有人试过这样的事吗?这甚至可能吗?

1 个答案:

答案 0 :(得分:0)

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

无论确切的问题是什么,我建议做主线程中的所有GUI内容都会更加安全。像这样:

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

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

dialog->Show(true);