2011-12-29 26 views
1

私のメインダイアログには、プロセスを作成して終了する関数があります。最大15〜20秒かかることがあります。 WaitForSingleObjectを使用して単に待機すると、ダイアログボックスが応答しなくなります。内部メッセージループ

EnableWindow(FALSE)と内部のメッセージループの組み合わせを使用してダイアログブロックを作成したいが、MessageBoxとDoModalのやり方がアプリのフリーズのように見えることはありません。しかし、内部メッセージループをどのように行うのかは分かりません。

答えて

2

内部メッセージループを実行するのは、簡単なコーディングです。以下のような

何かがすべてです:

EnableWindow(FALSE); 
while (/* check for my exit condition */) 
{ 
    MSG msg; 
    if(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
    { 
     if(!AfxGetApp()->PumpMessage()) 
     { 
      ::PostQuitMessage(0); 
     } 
    } 
} 
EnableWindow(TRUE); 

は、プロセスの終了を待つために、あなたは(< 30ミリ秒)のタイムアウトメッセージループ内WaitForSingleObjectコール非常に短い使用することができます。またはMsgWaitForMultipleObjects。またはGetExitCodeProcess

別のアプローチをお勧めします。
1)
2新しいモーダルポップアップを表示)のOnInitDialogハンドラーでプロセスを起動し、タイマー
3を起動する)プロセスがまだのOnTimerハンドラで実行されている場合GetExitCodeProcess
4により、チェック)のプロセスが無いときEndDialogを呼び出しますもはやあなたは

3

私はあなたのアプローチがうまくいかないと恐れています。あなたのアプリはシングルスレッドで、少なくともあなたのUIはです。 WaitForSingleObjectを呼び出した後、スレッドはスリープ状態になり、ウィンドウメッセージは処理されません。内部メッセージループがあるということは問題ではありません。新しいスレッドを開始し、プロセスが終了するのを待ってから、UIスレッドに通知して終了してください。あるいは、それらの行に沿った何か。

1

MsgWaitForMultipleObjects関数を試してください。イベントオブジェクトを待つ間にWindowsメッセージを処理できます。

1

を実行することができ:

  • (少し複雑)ARRするメッセージのためまたはを終了するプロセスを待つためにMsgWaitForMultipleObjects(またはMsgWaitForMultipleObjectsEx)を使用しますive(通常の方法で処理する)。
  • RegisterWaitForSingleObjectを使用して、プロセスが終了したときに別のスレッドで呼び出されるコールバックを登録します(おそらくコールバックをウィンドウに表示するだけです)。
  • (かなり単純な)で待機を行うには、独自のスレッドを作成します。

私は第二のオプションで行くと思います。

0
DWORD ec; 

    if(CreateProcess(NULL, // No module name (use command line). 
     szExe,     // Command line. 
     NULL,           // Process handle not inheritable. 
     NULL,           // Thread handle not inheritable. 
     FALSE,          // Set handle inheritance to FALSE. 
     procFlags,    // No creation flags. 
     NULL,           // Use parent's environment block. 
     NULL,           // Use parent's starting directory. 
     &si,           // Pointer to STARTUPINFO structure. 
     &pi)           // Pointer to PROCESS_INFORMATION structure. 
     ) 
{ 

    while(GetExitCodeProcess(pi.hProcess, &ec) && ec == STILL_ACTIVE) 
    { 
    MSG msg; 
    while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
    { 
    if(!AfxGetApp()->PumpMessage()) 
    { 
     ::PostQuitMessage(0); 
     break; 
    } 
    } 
    // let MFC do its idle processing 
    LONG lIdle = 0; 
    while(AfxGetApp()->OnIdle(lIdle++)) 
    ; 
    } 
    } 
    if(ec) 
    { 
    CloseHandle(pi.hProcess); 
    } 
関連する問題