我正在编写一个多线程网络应用程序,我正在使用一个带阻塞套接字的独立线程来从服务器异步接收数据。
当我需要关闭套接字时,我使用一个函数来检查接收线程是否仍在运行,以及是否调用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
是从首先创建Receive线程的同一线程中调用的。
我的理解是,在使用
AfxBeginThread
时,HANDLE
返回了THREAD_ALL_ACCESS
访问权限,是这种情况,如果是,为什么我仍然会ERROR_INVALID_HANDLE
?
提前致谢!
答案 0 :(得分:0)
使用以下方式创建的线程:
m_hRecvThread = AfxBeginThread( RecvThread, hWndMainFrame )
将返回指向winthread的指针。但是GetExitCodeThread()
需要线程的句柄,例如,你可以传递RecvThread->m_hThread
,这将解决问题