0

すべてのスレッドを強制終了し、ダイアログボックスが消えましたが、まだ実行されています...プロセスがまだ実行されているように見えます。だから私はそれからプロセスを殺さなければならない。

exit(0)おそらく、アプリを終了するための最良の方法ではありません。別の方法はありますか、それともこれが最善ですか?どうも


次のコードはデバッガーに役立ちました。そうでない場合、OnCloseがクラッシュしました。

void CServerDlg::OnClose() 
{
    TerminateThread(this->hThread_TcpIp, 0);
    TerminateThread(this->hThread_ReadData, 0);
    TerminateThread(this->hThread_ReadSetup, 0);

    //exit(0); //<-- not good to use
    CDialog::OnClose();
}
4

2 に答える 2

0

CCatsServerDlg がアプリケーションのメイン ダイアログである場合、OnOK() または OnCancel() を呼び出すだけでアプリケーションが終了します。各スレッドを終了する必要はありません。プロセスが終了すると、それらは自動的に終了します。

PostQuitMessageを試すこともできます。

于 2012-06-09T13:24:58.657 に答える
0

いいえ:

exit() を使用して Windows アプリケーションを終了しないでください。

ほとんどのメッセージ (WM_CLOSE を含む) は、いくつかの手順を実行した後にシステムによって発行されるため、メッセージ ハンドラーを直接呼び出すべきではありません。

MSDN によると、TerminateThread を使用しないでください。

TerminateThread は、最も極端な場合にのみ使用する必要がある危険な関数です。

各スレッドは何らかのクリーニングを実行する必要があるため、すべてのスレッドを終了せずにアプリを閉じないでください。たとえば、空きメモリと Windows ハンドル。プロセスを終了するとメモリが解放される可能性がありますが、すべての Windows リソース (ユーザーとシステム) は解放されない可能性が高いため、これは適切なプログラミング方法ではありません。

あなたがすべきこと:

ワーカー スレッドを使用している場合は、同期メカニズムを使用してスレッドを終了します。これには、イベント オブジェクトを使用することをお勧めします。PostQuitMessage は、メッセージ キューを持つスレッド (通常は GUI スレッド) に対してのみ使用できます。

スレッドの終了を要求した後、WaitForMultipleObjects 関数を使用する必要があります。スレッドが終了したら、メイン スレッドを終了します。

ダイアログがモーダル メイン アプリケーション ウィンドウの場合は、EndDialog を呼び出します。ダイアログが終了したら、アプリケーションの InitInstance から FALSE を返す必要があります。

ダイアログがモーダル ダイアログでない場合は、スレッドを終了した後、DestroyWindow を呼び出す必要があります。

于 2012-06-09T14:45:23.373 に答える