0

私は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();

大丈夫です。ダイアログオブジェクトのクローンを作成することを考えていましたが、それは不可能です(基本クラスのコピーコンストラクターはプライベートです)。

誰かが以前にこのようなことを試したことがありますか?これも可能ですか?

4

1 に答える 1

0

ワーカースレッドでダイアログコンストラクターを呼び出すのはノーノーだと思います。

正確な問題が何であれ、メインスレッドですべてのGUIを実行する方がはるかに安全であることをお勧めします。このような:

カスタムイベントでは、列挙された整数を渡します。次に、コールバック関数で、switchステートメントを使用して、必要なダイアログを作成して表示します。

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

dialog->Show(true);
于 2013-03-08T14:50:08.980 に答える