0

私はマルチスレッドのネットワーク化されたアプリケーションを作成しており、サーバーから非同期でデータを受信するためにブロッキング ソケットを持つ別のスレッドを使用しています。

ソケットをシャットダウンする必要がある場合は、受信スレッドがまだ実行されているかどうか、および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ますか?

前もって感謝します!

4

1 に答える 1

0

以下を使用して作成されたスレッド:

m_hRecvThread = AfxBeginThread( RecvThread, hWndMainFrame )

winthread へのポインターを返します。ただしGetExitCodeThread()、たとえば、スレッドへのハンドルが必要です。渡すことができますRecvThread->m_hThread。これにより、問題が解決します

于 2014-02-22T19:27:31.493 に答える