请问:PostMessage每线程最大使用次数是1万次。不理解。 以前我以为是queue的条目是一万次,既然消息处理后就会从queue中删除,所以1万条cache很够用了。最近做程序才发现不是如此是只能call他1万次,不解。难道postmessage的消息不会从message queue中移除? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 PostMessage把消息扔到队列里去... 应该是队列有1万条,处理了消息就会移除,你的消息循环不会是PeekMessage(..., PM_NOREMOVE)吧 消息队列最多可以容纳10000条消息,只要从中移除消息,就可以再Post。试试这段代码:void Test(){ MSG msg; while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)); DWORD threadId = GetCurrentThreadId(); int n = 0; while (PostThreadMessage(threadId, WM_USER, 0, 0)) n++; printf("PostThreadMessage return FALSE, n=%d.\n", n); PeekMessage(&msg, 0, 0, 0, PM_REMOVE); if (PostThreadMessage(threadId, WM_USER, 0, 0)) printf("PostThreadMessage return TRUE after PeekMessage.\n"); else printf("PostThreadMessage return FALSE after PeekMessage.\n"); printf("Clear message queue. Let n=0\n"); while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)); n = 0; while (PostThreadMessage(threadId, WM_USER, 0, 0)) n++; printf("PostThreadMessage return FALSE, n=%d.\n", n);} 消息是如何取走的,按理说消息队列不应该这么大的PeekMessage(&msg, 0, 0, 0, PM_REMOVE) 难道postmessage的消息不会从message queue中移除?====================这个要看最后的参数. postmessage会被自动移除消息队列的。lz是不PeekMessage的参数错了,应该是PeekMessage(&msg, 0, 0, 0, PM_REMOVE) 也许是window内部限制把,消息在加入消息队列中最多10000左右,你不信用其他可以加入消息队列函数用下,估计也就在10000左右就没了,我试过,要是无限的话那不就是溢出BUG 用个doevents 好了啊。 消息没有remove吧, 我用PostThreadMessage就没这问题. http://blogs.msdn.com/oldnewthing/archive/2009/01/26/9375457.aspx PeekMessage() 参数决定分发后是否从队列中删除。 MFC是开源的吗? 关于shockwave flash object在MFC中的应用 编译错误? 有知道福建富士通信息软件有限公司和福建星网锐捷的吗? 请问怎么样才能获得当前窗口的句柄??? 关于字符显示 关于这个实例得得问题: 如何实现几个不相关程序窗口的切换? 指针数组问题,怎么弄也不对了 如何利用CDHTMLDialog 实现打印功能? VC++6.0中的mfc如何合并两个工程的exe 请教,SelectObject用法,显示为黑色
void Test()
{
MSG msg;
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE));
DWORD threadId = GetCurrentThreadId();
int n = 0;
while (PostThreadMessage(threadId, WM_USER, 0, 0)) n++;
printf("PostThreadMessage return FALSE, n=%d.\n", n);
PeekMessage(&msg, 0, 0, 0, PM_REMOVE);
if (PostThreadMessage(threadId, WM_USER, 0, 0))
printf("PostThreadMessage return TRUE after PeekMessage.\n");
else
printf("PostThreadMessage return FALSE after PeekMessage.\n");
printf("Clear message queue. Let n=0\n");
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE));
n = 0;
while (PostThreadMessage(threadId, WM_USER, 0, 0)) n++;
printf("PostThreadMessage return FALSE, n=%d.\n", n);
}
====================
这个要看最后的参数.
lz是不PeekMessage的参数错了,应该是PeekMessage(&msg, 0, 0, 0, PM_REMOVE)