以前我以为是queue的条目是一万次,既然消息处理后就会从queue中删除,所以1万条cache很够用了。最近做程序才发现不是如此是只能call他1万次,不解。难道postmessage的消息不会从message queue中移除?

解决方案 »

  1.   

    PostMessage把消息扔到队列里去...
      

  2.   

    应该是队列有1万条,处理了消息就会移除,你的消息循环不会是PeekMessage(..., PM_NOREMOVE)吧
      

  3.   

    消息队列最多可以容纳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);
    }
      

  4.   

    消息是如何取走的,按理说消息队列不应该这么大的PeekMessage(&msg, 0, 0, 0, PM_REMOVE)
      

  5.   

    难道postmessage的消息不会从message queue中移除?
    ====================
    这个要看最后的参数.
      

  6.   

    postmessage会被自动移除消息队列的。
    lz是不PeekMessage的参数错了,应该是PeekMessage(&msg, 0, 0, 0, PM_REMOVE)
      

  7.   

    也许是window内部限制把,消息在加入消息队列中最多10000左右,你不信用其他可以加入消息队列函数用下,估计也就在10000左右就没了,我试过,要是无限的话那不就是溢出BUG
      

  8.   

    用个doevents 好了啊。
      

  9.   

    消息没有remove吧, 我用PostThreadMessage就没这问题.
      

  10.   

    http://blogs.msdn.com/oldnewthing/archive/2009/01/26/9375457.aspx
      

  11.   

    PeekMessage() 参数决定分发后是否从队列中删除。