私はマルチスレッドのネットワーク化されたアプリケーションを作成しており、サーバーから非同期でデータを受信するためにブロッキング ソケットを持つ別のスレッドを使用しています。
ソケットをシャットダウンする必要がある場合は、受信スレッドがまだ実行されているかどうか、および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
ますか?
前もって感謝します!