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_INFORMATIONTHREAD_QUERY_LIMITED_INFORMATION访问权限。m_hRecvThread

我的m_hRecvThread句柄是在创建线程时设置的,如下所示:

m_hRecvThread = AfxBeginThread( RecvThread, hWndMainFrame );

这成功地创建了线程,并且线程运行良好并展示了预期的功能。TerminateThreadGetExitCodeThread是从最初创建 Receive 线程的同一线程调用的。

我的理解是,使用时AfxBeginThreadHANDLE返回的有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 回答