来自AfxBeginThread的无效手柄

时间:2012-09-03 16:01:22

标签: c++ multithreading winapi privileges

我正在编写一个多线程网络应用程序,我正在使用一个带阻塞套接字的独立线程来从服务器异步接收数据。

当我需要关闭套接字时,我使用一个函数来检查接收线程是否仍在运行,以及是否调用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_INFORMATIONm_hRecvThread访问权限。

在创建线程时设置了我的m_hRecvThread句柄:

m_hRecvThread = AfxBeginThread( RecvThread, hWndMainFrame );

这成功创建了线程,并且线程运行正常并展示了预期的功能。 TerminateThreadGetExitCodeThread是从首先创建Receive线程的同一线程中调用的。

  

我的理解是,在使用AfxBeginThread时,HANDLE返回了THREAD_ALL_ACCESS访问权限,是这种情况,如果是,为什么我仍然会ERROR_INVALID_HANDLE

提前致谢!

1 个答案:

答案 0 :(得分:0)

使用以下方式创建的线程:

m_hRecvThread = AfxBeginThread( RecvThread, hWndMainFrame )

将返回指向winthread的指针。但是GetExitCodeThread()需要线程的句柄,例如,你可以传递RecvThread->m_hThread,这将解决问题