一个很奇怪的有关问题,线程退出,WaitForSingleObject没有返回

一个很奇怪的问题,线程退出,WaitForSingleObject没有返回
代码如下

m_hHeartBeatThread = CreateThread(NULL,0,SendHeartBeatProc,this,0,&m_dwHeartBeatThreadID);
//句柄和ID都有值

DWORD WINAPI CMng::SendHeartBeatProc(LPVOID lpParameter)
{
CMng* pThis = (CMng*)lpParameter;
if (NULL == pThis)
{
return FALSE;
}

BOOL bStartedTimer = FALSE;
int nTimerID = 0;
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
case WM_THREAD_START_TIMER:
{

}
break;

case WM_TIMER:
{

}
break;
}

TranslateMessage(&msg);
DispatchMessage(&msg); 
}

printf(“SendHeartBeatProc exit \n");
return TRUE;
}

退出时执行的代码
if (m_hHeartBeatThread)
{
if (m_dwHeartBeatThreadID)
{
if (!::PostThreadMessage(m_dwHeartBeatThreadID,WM_QUIT,0,0) )
{
printf(..);
}
}

DWORD dwRet = WaitForSingleObject(m_hHeartBeatThread, INFINITE);
if (WAIT_TIMEOUT == dwRet)
{
::TerminateThread(m_hHeartBeatThread,0);
}

SAFE_CLOSE_HANDLE(m_hHeartBeatThread);
}

线程启动后不做任何操作,然后退出时执行上述代码,postthreadmessage后线程函数退出了,并且有打印”SendHeartBeatProc exit “,但奇怪的是WaitForSingleObject并没有返回,一直卡在这,感觉好奇怪。
运行环境:wince系统,线程是运行在一个DLL里,然后别人写的EXE加载这个DLL。有没有人碰到过类似的情况
------解决方案--------------------
试试在 GetMessage 之前,先调用一个空的   PeekMessageW(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);

------解决方案--------------------
那就说明你没有发出 WM_THREAD_START_TIMER或者WM_TIMER:给线程,线程一直处于循环之中

------解决方案--------------------
这段代码看起来没什么问题,在win32下跑一下试试。

另,INFINITE的等待不会TIMEOUT

一般的用法是等待一段时间,然后判断线程是否在运行,在运行则杀死,然后关闭句柄
------解决方案--------------------
这里的问题是线程return了,但是没有真正结束,是否是僵死了。在win32下调试一下,看线程到底是否还在
------解决方案--------------------
DWORD WINAPI SendHeartBeatProc(LPVOID lpParameter)
{
MSG msg;
BOOL bExitThread = FALSE;
while(GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
case WM_THREAD_START_TIMER:
{

}
break;

case WM_TIMER:
{

}
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg); 
}

printf("endHeartBeatProc exit \n");
return TRUE;
}


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
m_hHeartBeatThread = CreateThread(NULL,0,SendHeartBeatProc, NULL, 0,&m_dwHeartBeatThreadID);

if (m_hHeartBeatThread)
{
if (m_dwHeartBeatThreadID)
{
BOOL bRet = FALSE;
while (!bRet )
{
printf("Post Message.\r\n");
bRet = PostThreadMessage(m_dwHeartBeatThreadID, WM_QUIT, 0, 0);
}
printf("Post Success.\r\n");
}

DWORD dwRet = WaitForSingleObject(m_hHeartBeatThread, INFINITE);
if (WAIT_TIMEOUT == dwRet)
{
::TerminateThread(m_hHeartBeatThread,0);
}
}
return 0;
}

------解决方案--------------------
            while (!bRet )
            {
                printf("Post Message.\r\n");
                bRet = PostThreadMessage(m_dwHeartBeatThreadID, WM_QUIT, 0, 0);
            }
//
还是这样 牢靠:
PostThreadMessage 不能保证 消息 被 执行。

            while (!bRet )
            {
                printf("Post Message.\r\n");
                bRet = PostThreadMessage(m_dwHeartBeatThreadID, WM_QUIT, 0, 0);
               Sleep(0);            
             }