【问题标题】:wxWidgets application freezes when trying to start new dialogwxWidgets 应用程序在尝试启动新对话框时冻结
【发布时间】:2013-02-24 03:12:03
【问题描述】:

我正在开发一个 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();

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

以前有没有人尝试过这样的事情?这甚至可能吗?

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这使事情变得复杂。谢谢。
    猜你喜欢
    • 2014-01-01
    • 2014-05-24
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多