1

私は奇妙な種類の問題を抱えています。次のシナリオを検討してください。

  • メインウィンドウは、ボタンをクリックすると子ダイアログを作成します。
  • 子ダイアログは、ワーカー スレッドでいくつかのタスクを実行します。
  • そのタスク中にエラーが発生し、メッセージ ボックスが表示されて、「イイね! 何かがおかしくなりました.」 のようなメッセージが表示されます。
  • 子ダイアログの「キャンセル」ボタンをクリックすると、子ダイアログが閉じられます。
  • メッセージボックスはまだアクティブです!メッセージ ボックス内の何かをクリックすると、クラッシュします。

物事がどのように起こっているかの疑似コード: (ここでは構文の正しさを無視してください)

MainWindowClass mainObj;

void MainWindowClass::OnSomeButtonClick()
{
    SomeDialogClass someDialogObj;
    someDialogObj.DoModal();
}

int MainWindowClass::doTask()
{
    // Do work
    if(ERROR)
    {
        MessageBox("Yikes! Something went wrong.", "Error", MB_OK);
        return ERROR;
    }
} 

///////////////////////////////////////////////////////////////////
// Meanwhile, in another file,

extern MainWindowClass mainObj;

void SomeDialogClass::OnCancel()
{
    // Do all cleanup and close dialog
}

int SomeDialogClass::workerThreadFunc()
{
    return mainObj.doTask();
}

int SomeDialogClass::DoModal()
{
    AfxBeginThread(workerThreadFunc);
    // Do all other work and then wait for the worker thread
}

私の質問は 2 つあります。

  1. キャンセル時に、同じアプリケーションのメッセージ ボックス/ダイアログがアクティブかどうかを知る方法はありますか?
  2. 私のデザイン全体が間違っているのでしょうか?

モーダル ダイアログを使用する主な理由の 1 つは、フォーカスが親ダイアログに移動するのを防ぐ機能だと思いました。それでも、そのエラー メッセージ ボックスが表示されたら、喜んでダイアログをクリックし、[キャンセル] をクリックして、エラー メッセージ ボックスが表示されなかったふりをすることができます。

4

2 に答える 2

5

ワーカー スレッドにモーダル メッセージ ボックスを表示させるのではなく、エラー状態を UI スレッドに通知する必要があります。MFC とマルチスレッドに関する私の経験では、すべての UI を同じスレッドで処理することで、物事がはるかに単純になり、これらの種類のエラーが取り除かれます。2 つのスレッドが同時にモーダル ダイアログを表示する可能性があると、問題が発生します。

于 2013-03-08T11:13:49.160 に答える