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