在一个工作线程中用PeekMessage建立循环接受消息,请问它的参数是用PM_NOREMOVE还是PM_REMOVE呢?

ligongda99 2008-01-16 07:03:08
请问在在工作线程中建立消息循环要用到PeekMessage(),然后再在循环体中调用GetMessage()处理用到的消息。PeekMessage它的最后一个参数是用PM_NOREMOVE还是PM_REMOVE呢?有什么区别?

UINT ThreadFunc(LPVOID lParam)
{
...
PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_REMOVE); //建立消息循环
while (TRUE)
{
if(GetMessage(&msg,NULL,0,0))
{
switch(msg.message)
{
...
}
}
}

return 0;
}
...全文
1080 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
内存泄漏 2008-01-17
  • 打赏
  • 举报
回复
呵呵,应该说每个UI线程都有自己的消息队列,而包括非UI线程在内的所有线程一旦调用了与GDI相关的函数或检查消息队列时,系统就会为线程建立消息队列。如:CreateWindow,GetMessage,PeekMessage等。
jameshooo 2008-01-17
  • 打赏
  • 举报
回复
3楼理解正确,GetMessage也可以强制建立消息队列
内存泄漏 2008-01-17
  • 打赏
  • 举报
回复
消息队列不用建立的, 每个线程都有自己的消息队列.. 只是说你可以用GetMessage或者PeekMessage函数来取消息
ligongda99 2008-01-17
  • 打赏
  • 举报
回复
也就是说GetMessage也可以在工作线程中建立消息队列了,和PeekMessage一样?
内存泄漏 2008-01-16
  • 打赏
  • 举报
回复
你PeekMessage了, 还GetMessage干吗? 这两个函数功能类似, 在不需要响应客户界面的线程中用GetMessage就可以了,它们有以下两个区别:
1. GetMessage将等到有合适的消息时才返回, 而PeekMessage只是撇一下消息队列。
2. GetMessage会将消息从队列中删除, 而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中, PM_NOREMOVE为保留, PM_REMOVE为不保留。
jameshooo 2008-01-16
  • 打赏
  • 举报
回复
建立消息队列(你不应该叫循环)用哪个都无所谓,因为没有消息在里面,所以即使选择PM_REMOVE也跟PM_NOREMOVE效果一样。
你这段代码不需要使用PeekMessage这个语句,因为后面马上就是消息循环体,也会帮你建立消息队列。
只有一种情况需要使用PeekMessage来建立消息队列,那就是Peek之后会有一段时间执行某项工作,然后才正式消息循环,但是消息循环之前可能会有别的线程向你的线程发送消息过来,此时就要预先建立消息队列。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧