我的程序如下。#include <afxwin.h>#define WM_MY_MSG     WM_USER + 1
#define WM_MY_QUIT    WM_USER + 2
UINT ThreadFunc(LPVOID lParam)
{
MSG msg; while(true)
{
if ( GetMessage(&msg, NULL, 0, 0) )
{
if (msg.message == WM_MY_MSG)
{
                                AfxMessageBox("receive msg"); //若不用次
                                   //行则5各消息都能收到

}
else if (msg.message == WM_MY_QUIT)
{
break;
}
}
} return 0;
}int main( void )
{
BOOL       bSendRes;
DWORD      dwCode;
CWinThread *pThread;
pThread = AfxBeginThread(ThreadFunc, &dwCode); Sleep(10);   //等待线程建立 //注意!!!发送5次消息。
for (int i = 0; i < 5; i++)
{
bSendRes = pThread->PostThreadMessage(WM_MY_MSG, 0, 0);
        if (!bSendRes)
{
AfxMessageBox("send msg failed");
break;
}
} Sleep(5000);
pThread->PostThreadMessage(WM_MY_QUIT, 0, 0);
Sleep(100); return 0;
}
我向子线程连续发送了5各消息, 可子线程却只产生一个message box ,若不用AfxMessageBox(),则5个消息都能收到???请指明,小弟万分感激。。

解决方案 »

  1.   

    这是当然的了,在那里是不能用AfxMessageBox()的,他会让程序停止响应的,要注意有一个原则,就是在处理消息时,处理时间不能超过500MS要不就会出现问题
      

  2.   

    应该不是处理时间的问题。即使在收到每个WM_MY_MSG消息后延时30秒钟,也能收到5个消息,可只要用AfxMessageBox(),接下来几各消息就收不到,不知是不是AfxMessageBox()将消息队列中原来得消息破坏掉了???期盼高手指教。
      

  3.   

    那是因为AfxMessageBox在内部调用MessageBox,而MessageBox将弹出一个有模式对话框。
    在弹出有模式对话框时你的调用线程好象挂起一样,非得等到对话框退出后才继续执行。而实际上并没有将你的线程挂起,而是有模式对话框在内部自己建立一个消息循环,只有当按了OK按钮或其它的什么才会使其退出其自己建的内部循环,再返回调用端。由于楼主弹出的是有模式对话框,你发出的5个消息(4个WM_MY_MSG和1个WM_MY_QUIT)都被MessageBox弹出的对话框的内部自建循环给GetMessage出来且都丢弃了,所以楼主只能收到一次消息。至于为什么可以收到WM_MY_QUIT,已经很简单了,如果楼主在5000毫秒后再点取对话框的OK按钮,那么楼主的线程就死锁了,永不退出(这是正常情况,不过由于楼主连这里都用Sleep(),所以不会死锁)。另外的,建议楼主以后别再使用Sleep(),Sleep()的调用就代表这这个程序中有着逻辑BUG(因为时间是没有保障的,有的机子快,有的机子慢),所有出现Sleep的地方都应该去掉。