2012-02-20 38 views
0

基本的に一連の複雑な計算を行うシングルダイアログアプリケーションを作成しました。アプリケーションは最初にWin32コンソールアプリケーションとして作成され、その後、プログレスバーを追加することに決めた後、コンソールアプリケーションをシングルダイアログベースのアプリケーションに変換しました。ダイアログにはプログレスバーがあります。ダイアログのOnInitDialog()関数で、私は計算を開始します。計算はワーカースレッド上で実行されています。このスレッドは、_beginthreadex関数を呼び出すことによって作成されます。プログレスバーは、PostMessageを使用してダイアログにメッセージを投稿することによってスレッドによって更新されます。スレッドの実行が完了したら、CDialog :: OnOK()関数を呼び出してダイアログを閉じます。問題は、ダイアログが閉じられた後でも、アプリケーションがすぐに終了しないということです。ダイアログが閉じていても、アプリケーションを閉じるのに2秒近くかかります。 この問題を解決するためのお手伝いをしております。おかげさまで MFCスレッディング問題 - すべてのスレッドが完了した後にプログラムが終了しない

+0

ダイアログが閉じた後にデバッガでヒットします。デバッガはどのコードでブレークしますか?アクティブなスレッドは何ですか? – usr

+1

アプリケーションが終了した後でVisualStudioの[出力]タブに(Debugビルドとして)報告されたメモリリークはありますか?これにはしばらく時間がかかります。 – Clemens

+0

@ xml-tools:そうです、あなたは正しいです。いくつかのメモリリークが報告されています。私はそれらを見て、それらを修正しようとします。ありがとう。 – Ram

答えて

0

ワーカースレッドがまだ実行中であるためです。すべてのスレッドが実行を終了するまで、アプリケーションは終了しません。あなたのUIスレッドはワーカースレッドの前に閉じているので、ウィンドウは隠されているかもしれませんが、ワーカースレッドが作業を完了するまでプロセスは終了しません。

0

ワーカースレッドがまだ実行されている可能性があります。スレッドが停止していることを確認するには、イベントを使用して信号を送ります。ユーザーがダイアログの閉じるボタンを押したときにスレッドを強制終了するイベントを通知することができます。

あなたの複雑な計算の中でイベントが通知されているかどうか(ループかもしれない)を確認して、それから壊れているかどうかを確認できます。したがって、問題なくスレッドを停止します。

while(true) 
{ 
    //Some complex task 

    DWORD dwWaitResult; 
    dwWaitResult = WaitForSingleObject(hwndShutdownEvent,0); 
    if (WAIT_OBJECT_0 == dwWaitResult) 
    { 
     break;     
    } 
} 
+0

いいえ、これは当てはまりません。すべてのワーカースレッドは終了です。問題はメモリリークです。とにかくあなたの時間のおかげで – Ram

関連する問題