这二天刚好要用多线程连接一个服务器,本来一个很简单的问题,被搞的困惑了半天,感觉终于弄清楚了,记录下,测试的代码很简单,但是就是一直崩溃,代码如下:

UINT ThreadTest(LPVOID lParam)
{
    /*
        //连接服务器
    */
    Sleep(5000);
    AfxMessageBox(_T("连接成功"));
    return 0;
}
void OnBnClickTest()
{
    CWinThread* pThread = AfxBeginThread(ThreadTest,NULL);
    if(NULL != pThread)
        WaitForSingleObject(pThread->m_hThread,INFINITE);
}


这样一个简单的小例子为什么会一直无响应呢,但是如果把等待函数的INFINITE参数改成数值的话,就可以在等待对应的数值之后,变为正常,但要是不知道时间呢,其实解决的办法也有,就是不用WAIT函数,这样即可正常运行,然后在子线程中,连接成功或者失败后给主线程发消息,但是碰到问题,不知道答案,还是想解决下的,所以,还是在寻找答案。

    中午时翻阅资料发现,在调用弹出框消息时,会调用SendMessage发送消息到消息队列,而SendMessage函数会一直等待消息返回,它不像PostMessage函数,而这时主线程中的WaitForSingleObject函数又是INFINITE,所以它一直无限等待,必然导致主线程阻塞,也就导致了消息循环的阻塞,所以这时大家就互相等待,死锁了,导致程序无响应.

   所以只要子线程中不调用发送消息给队列的函数,或者把Wait函数,改成MSGWaitMutipleObject函数,就可以解决这个看起来简单,但比较诡异的问题了。

   哎,原理性问题,一般都不被大家重视,SO,SO,都一碰到问题,傻了,呵呵。