关于线程代码执行完了,但线程未退出,也未激发WaitForSingleObject的问题。
RT,具体代码如下:
BOOL CMsgQueue::StopRevMsgThread(void) { if(m_hRevMsgThread) { //m_bThreadExit = TRUE; CMsgQueue cMsgQueue(L"MsgQueueTest",1024,WriteMode); // 往消息队列写数据 cMsgQueue.Write("__EXIT__",9); cMsgQueue.Close(); // 等待线程成功退出 WaitForSingleObject(m_hRevMsgThread,INFINITE); CloseHandle(m_hRevMsgThread); m_hRevMsgThread = NULL; m_hRevMsgThread = FALSE; lpBuffer?free(lpBuffer),lpBuffer=0:0; } return ((m_hRevMsgThread==NULL) ? TRUE : FALSE); } DWORD WINAPI CMsgQueue::RevMsgThread(LPVOID pParam) { CMsgQueue *pMsgQueue=(CMsgQueue*)pParam; DWORD dwReadNums=0; while(!pMsgQueue->m_bThreadExit) { if(!pMsgQueue->m_hMsgQueue ) break; // 从消息队列中读取一条消息(阻塞模式) BOOL ret=pMsgQueue->Read(pMsgQueue->lpBuffer,pMsgQueue->m_dwQueueSize,&dwReadNums,INFINITE); printf("Read ret=%d,dwReadNums=%d/n",ret,dwReadNums); if(dwReadNums>0) { // 调用回调函数 if(strcmp("__EXIT__",(char*)pMsgQueue->lpBuffer)){ if(pMsgQueue->m_MsgCallBack) pMsgQueue->m_MsgCallBack(pMsgQueue->lpBuffer,dwReadNums); }else{ break; } } } printf("RevMsgThread exit...\r\n"); ::ExitThread(0); return 0;}