新手,100分请教一个消息队列问题。公司一个已经离职的同事留下的源代码。...... //开一个线程,去做一些事情,做完把bFinished置TRUEwhile (!bFinished)
{
    if (PeekMessage(lpMsg, 0, 0, 0, PM_REMOVE))
    {
         TranslateMessage(lpMsg);
         DispatchMessage(lpMsg);
     }
}......//做一些free动作,退出函数。
我大致知道PeekMessage是从消息队列里取一个消息,TranslateMessage是转化键盘消息,DispatchMessage是分发消息。但只是大致知道,还不够透彻。哪位高手能够分析得更详细一点:1.PeekMessage从消息队列里取一个消息,是操作系统有一个消息队列,还是每个程序都一个消息队列,dll和应用程序共用消息队列还是自己有消息队列?2.最后一个参数使用PM_REMOVE和PM_NOREMOVE有什么区别?什么情况下使用前者什么情况下使用后者?这是一个dll的导出函数,我把它换成PM_NOREMOVE会不会有什么不好的后果?3.我换成PM_NOREMOVE以后,做完事情到函数退出之间得时间变短了,这是为什么?回答任何一个问题都有分,非常感谢!

解决方案 »

  1.   

    PM_REMOVE和PM_NOREMOVE区别:在于是否可以删除单步跟踪看到哪儿?
      

  2.   

    操作系统本身自己有一个消息队列.当他创建线程的时候,他也会为每一个线程创建一个消息队列.PeekMessage是从自身的线程队列里面选取东西.
    PM_NOREMOVE 不会把消息使用后删掉.PM_REMOVE则删除.
      

  3.   

    我觉得这样的代码不如改用Event来的直接。
    首先CreateEvent,然后WaitForSingleObject等待事件发生。当线程完成工作之后SetEvent。主线程等到事件之后或ResetEvet(如果还要利用该事件)或CloseHandle关闭Event(如果该事件已不再使用)
      

  4.   

    有这样写的代码吗? 这如果不是游戏的循环框架, 如果不是需要不断地利用CPU时间做事, 这个代码就是非常差劲的.
    解决办法如楼上所讲
      

  5.   

    可以把PeekMessage换成GetMessage这样线程在没有收到消息的时候是不会占用CPU资源的.