子线程内部使用PeekMessage 的问题

liulin2017 2012-07-18 11:38:27
调用这个函数后建立消息队列,队列里保存的是消息。

请问是什么消息?

我感觉是不知名的消息。

{
Peekmessage(,,,NO_REMOVE);

While(GetMessag(,,,)) //这里我问题
{
switch()
{
case


}



while哪里改用Peekmessage还是用getMessage

如果用GetMessage,那么就会取走消息了, 那样while就不会进入。。

如果不用的话,那么消息是不是拿不走,这样,永远在while里面了。

就算你post一个消息给线程,线程能响应你post的消息吗,因为前面已经有其他消息了。。。。



感觉有些矛盾。

...全文
518 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
你好,我问的:不是立即返回或者不立即返回
而是: 返回值,你看过msdn, 应该知道返回值是什么意思吧
有消息返回true;
么有返回false.
当线程调用getmessage的时候, 进入while循环,说明有消息,
请问是什么消息在里面,
还有:为什么不用peekmessage。

引用 6 楼 的回复:
线程中可……
[/Quote]

是什么消息在里面,系统/线程/进程/服务等投递的消息都有可能,如常用到的WM_CREATE WM_ERASEBKGND WM_PAINT WM_KEYDOWN WM_KEYUP WM_LBUTTONDOWN WM_LBUTTONUP WM_RBUTTONDONW WM_RBUTTONUP WM_COMMAND WM_NOTIFY WM_TIMER WM_DESTROY 及自定义消息等

GetMessage 和 PeekMessage 最大的区别在于: GetMessage 是属于阻塞型的,消息队列中没有消息的时候会死等,而 PeekMessage 不会被阻塞,立即返回。另外 GetMessage 会从消息队列中按取走消息,PeekMessage 用 PM_NOREMOVE 可以只窥探队列中有没有消息。

GetMessage 的应用场合在标准的Windows程序中应用最多,因为消息获取(Get)和处理消息的lpfnWndProc处于不同的线程中,在没有消息的时候GetMessage被阻塞,此时它也将不消耗CPU时间,当然用PeekMessage也能完成取出消息的目的,但是就浪费CPU时间了

//消息泵
{
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
TranslateMessage(&msg); //处理用户输入字符
DispatchMessage(&msg); //派遣消息
}
}

//消息处理的回调函数
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
TCHAR szText[]= _T("简单的程序!");
switch(message)
{
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
hdc=::BeginPaint(hwnd,&ps);
::TextOut(hdc,10,10,szText, _tcslen(szText));
::EndPaint(hwnd,&ps);
return 0;
}
case WM_DESTROY:
::PostQuitMessage(0);
return 0;
}
return ::DefWindowProc(hwnd,message,wParam ,lParam);
}



PeekMessage 在线程和时间长的处理函数中用的比较多,如在有个按钮按下的时候,需要处理一个比较长的时间,此时因为已经处在DispatchMessage派遣消息的过程中,因此这个操作将导致其它的消息不能及时被处理,这就会导致程序的假死状态。这时最好就是能提示用户等待,并且能让用户取消这个操作,此时再使用阻塞模式的GetMessage显然是不合适的

//如下面有一个长时间的操作,按下Ctrl+C退出

{
fDone = FALSE;
for(int iLoop = 0; !fDone && iLoop; iLoop++)
{
fDone = DoLengthyOperation(iLoop); //冗长的操作

//从检查是否有键盘消息并取走
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if(msg.message == WM_KEYDOWN && msg.wParam == 'C')
{
fDone = TRUE; break;
}
}
}
}


不知道说清楚了没 搜搜Windows消息机制/消息泵 网上说的挺多的

liulin2018 2012-07-19
  • 打赏
  • 举报
回复
不认真看贴

我是马甲

ouyh12345 2012-07-19
  • 打赏
  • 举报
回复
应该是PostThreadMessage
liulin2018 2012-07-19
  • 打赏
  • 举报
回复
你好,我问的:不是立即返回或者不立即返回

而是: 返回值,你看过msdn, 应该知道返回值是什么意思吧

有消息返回true;

么有返回false.

当线程调用getmessage的时候, 进入while循环,说明有消息,

请问是什么消息在里面,

还有:为什么不用peekmessage。








[Quote=引用 6 楼 的回复:]

线程中可以用 PeekMessage, PeekMessage即使没有读到消息 也会立即返回,不会导致线程阻塞
可以参考 MSDN 的帮助文档 Using Messages and Message Queues

在MFC中UI线程用个 CWinThread 比较容易,使用和MFC应用程序很相似
Multithreading: Creating User-Interface Threa……
[/Quote]
ouyh12345 2012-07-19
  • 打赏
  • 举报
回复
每个线程都有自己的消息队列,向线程发消息用SendThreadMessage
zgl7903 2012-07-19
  • 打赏
  • 举报
回复
线程中可以用 PeekMessage, PeekMessage即使没有读到消息 也会立即返回,不会导致线程阻塞
可以参考 MSDN 的帮助文档 Using Messages and Message Queues

在MFC中UI线程用个 CWinThread 比较容易,使用和MFC应用程序很相似
Multithreading: Creating User-Interface Threads
liulin2017 2012-07-19
  • 打赏
  • 举报
回复



到底用哪一个函数啊

PeekMessage

还是GetMessage

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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