私はマルチスレッドのネットワーク化されたアプリケーションを作成しており、サーバーから非同期でデータを受信するためにブロッキング ソケットを持つ別のスレッドを使用しています。
ソケットをシャットダウンする必要がある場合は、受信スレッドがまだ実行されているかどうか、およびTerminateThread次のように終了するための呼び出しであるかどうかを確認する関数を使用します。
DWORD dwExitCode = 0;
if( GetExitCodeThread( theApp.m_hRecvThread, &dwExitCode ) && dwExitCode == STILL_ACTIVE )
TerminateThread( theApp.m_hRecvThread, 0 );
ただし、 をGetExitCodeThread返しFALSE、ポーリングGetLastError()すると 6 ( ERROR_INVALID_HANDLE) を返します。これは、ハンドルに対するTHREAD_QUERY_INFORMATIONまたはTHREAD_QUERY_LIMITED_INFORMATIONアクセス権を持っていないことを示唆しています。m_hRecvThread
私のm_hRecvThreadハンドルは、次のようにスレッドを作成するときに設定されます。
m_hRecvThread = AfxBeginThread( RecvThread, hWndMainFrame );
これによりスレッドが正常に作成され、スレッドは正常に実行され、期待される機能を示しています。TerminateThreadとはGetExitCodeThread、最初に受信スレッドを作成した同じスレッドから呼び出されています。
私の理解では、 を使用する
AfxBeginThreadと、HANDLE返された にはTHREAD_ALL_ACCESSアクセス権がありましたが、これは事実ですか? もしそうなら、なぜ私はまだ取得していERROR_INVALID_HANDLEますか?
前もって感謝します!