`
dato0123
  • 浏览: 910874 次
文章分类
社区版块
存档分类
最新评论

PostQuitMessage和PeekMessage的诡异行径

 
阅读更多

//=====================================================================
//TITLE:
// PostQuitMessage和PeekMessage的诡异行径
//AUTHOR:
// norains
//DATE:
// Monday 8- March-2010
//Environment:
// WINDOWS CE 5.0
// WINDOWS XP
//=====================================================================

在将程序从WinCE移植到WinXP中,发现之前移植运行得正常的程序,居然无法退出了。经过排查,发现问题出在这段代码:


  
  消息循环的代码也很简单:
  
  代码意思很简单,如果是CMD_EXIT命令的话,就直接发送PostQuitMessage消息,退出消息循环。而调用PeekMessage的目的也非常简单,就是去掉鼠标左键消息。因为在处理第一次鼠标按键的过程中,可能用户还在不停地点击相同的按钮,从而导致同一个按钮的不停的滞后响应。
  
  这段代码结构在WinCE5.0下是没有任何问题的,一切跑得非常正常顺畅。但如果是在WinXP下,就迥然不同了--GetMessage看起来根本就没有接收到WM_QUIT消息!
  
  说无法接收其实也不完全对,如果你在PostQuitMessage这行代码设置断点,停在断点时,然后再按F5让其继续全速奔跑,那么程序又能正常退出了。
  
  是不是很诡异?那时候PeekMessage没调用,只是在PostQuitMessage这里暂停了一下,就一切正常了。
  
  最后真正的原因我也没有找到,因为我也没有WinXP的内核代码。但根据过往的经验推测,这个应该是多线程的原因。很可能是WinCE和WinXP在消息处理模型不一样的缘故。WinCE可能为了节约资源,消息是一个一个进行处理;而WinXP不同部分的消息,可能是分为多个线程来进行处理。
  
  以我们的代码进行推测,当正常运行时,在我们调用PostQuitMessage后,WM_QUIT还没有进入准备的消息队列。而调用PeekMessge去除鼠标左键消息的时候,同时也将WM_QUIT从队列中移除。
  
  而在PostQuitMessage设置断点的情况可能有点不同。跑过这句后,可能WM_QUIT已经进入了准备的消息队列,所以之后的结果就如我们之前所预想的。
  
  不过,这也只是我的推测,究竟实际是否如此,还望大家指教。

分享到:
评论

相关推荐

    WinAPI (Delphi版)

    PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx ...

    绘图板绘图板

    一个简单的绘图板win32程序 #include "windows.h" HINSTANCE hinst=NULL; HWND btn_close,btn_line,btn_rect,btn_ell,btn_cpen,btn_cbrush,btn_label; HDC hDC,hDC_lable;... PostQuitMessage(0); }

    自己写的小游戏壳

    PostQuitMessage 0 ; } else { 调用函数指针创建子类对象 ctrl CGameCtrl::pfun create ; 设置句柄 ctrl >SetHandle hwnd hIns ; 游戏的初始化 ctrl >OnCreateGame ; } ...

    VC 创建WinExample和MFCExample窗口程序演示.rar

    VC WinExample和MFCExample程序演示,是创建此两类程序的演示,一种是使用WINAPI的方式 创建程序窗口,另一种是采用MFC方式创建窗口,下面列举一上结使用WINAPI方式创建窗口的具体代码,完整代码请下载本源码。...

    vc++图书销售管理系统

    毕业设计图书销售管理系统//如果数据源存在则连接数据库 try{m_Database.OpenEx ("DSN=book",0);} catch(...) ... try{LoadDbSource ("book",path+"db\\book.mdb");... PostQuitMessage(0); } }

    MFC中解决子线程中打开非模态对话框内存泄漏实例(VC++2008)

    PostQuitMessage 0 ; TODO: 在此处添加消息处理程序代码 } 另外默认的Ok Cancel按钮换成 void CMyDlg::OnBnClickedOk { TODO: 在此添加控件通知处理程序代码 OnOK ; this >DestroyWindow ; } void ...

    最全的WinAPI手册

    第十三节 消息和消息总队列函数(Message and Message Queue) 165 BroadcastSystemMessage 165 DispatchMessage 166 GetlnputState 167 GetMessage 167 GetMessageExtralnfo 168 GetMessagePos 168 GetMessageTime ...

    易语言f_in_box封装演示

    易语言f_in_box封装演示源码,f_in_box封装演示,WinFroc,GetSystemMetrics,SetCapture,ReleaseCapture,CreateMenu,AppendMenu,TrackPopupMenu,PostQuitMessage

    在C#中SendMessage和PostMessage的参数传递

    Post WM_QUIT 时,应使用 PostQuitMessage 代替。 4、系统只整编(marshal)系统消息(0 到 WM_USER 之间的消息),发送用户消息(WM_USER 以上)到别的进程时,需要自己做整编。 用 PostMessage、...

    易语言凭空创建窗口

    凭空创建窗口,窗口函数,CreateWindowEx,RegisterClassEx,ShowWindow,UpdateWindow,GetModuleHandle,DefWindowProc,DispatchMessage,GetMessage,TranslateMessage,LoadCursor,LoadIcon,PostQuitMessage

    易语言载入窗口模态

    易语言载入窗口模态源码,载入窗口模态,载入_模态,DialogProc,GetMessageA,PeekMessageA,TranslateMessage,DispatchMessageA,PostQuitMessage,TranslateAcceleratorA,EnableWindow,SetForegroundWindow,...

    易语言API创建窗口

    易语言API创建窗口源码,API创建窗口,创建窗口,窗口函数,CreateWindowEx,RegisterClassEx,ShowWindow,UpdateWindow,GetModuleHandle,DefWindowProc,DispatchMessage,GetMessage,TranslateMessage,...PostQuitMessage

    易语言甩动窗口

    甩动窗口,窗口函数,CreateWindowEx,RegisterClassEx,ShowWindow,UpdateWindow,GetModuleHandle,DefWindowProc,DispatchMessage,GetMessage,TranslateMessage,LoadCursor,LoadIcon,PostQuitMessage,GetMenu,...

    易语言HelloWindow

    易语言Hello Window源码,Hello Window,WndProc,WinMain,PlaySound,BeginPaint,GetClientRect,DrawText,EndPaint,PostQuitMessage,DefWindowProc,LoadIcon,LoadCursor,GetStockObject,RegisterClass,CreateWindow,...

    易语言凭空创建窗口并响应窗口消息

    易语言凭空创建窗口并响应窗口消息源码,凭空创建窗口并响应窗口消息,窗口函数,CreateWindowEx,RegisterClassEx,ShowWindow,UpdateWindow,GetModuleHandle,DefWindowProc,...LoadCursor,LoadIcon,PostQuitMessage

    易语言仿PhotoShop浮动工具栏

    易语言仿PhotoShop浮动工具栏源码,仿PhotoShop浮动工具栏,WindowProc,消息循环,RegisterClass,UnregisterClass,CreateWindowEx,UpdateWindow,ShowWindow,GetClientRect,ClientToScreen,...PostQuitMessage,DefWindo

    易语言窗口消息机制

    易语言窗口消息机制源码,窗口消息机制,窗口主程序,窗口回调函数,GetModuleHandle,GetCommandLine,LoadIcon,LoadCursor,RegisterClassEx,CreateWindowEx,ShowWindow,UpdateWindow,...PostQuitMessage,DefWindowProc,

    易语言使用sdk方式创建窗口

    易语言使用sdk方式创建窗口源码,使用sdk方式创建窗口,窗口主程序,窗口回调函数,GetModuleHandle,GetCommandLine,LoadIcon,LoadCursor,RegisterClassEx,CreateWindowEx,ShowWindow,...DispatchMessage,PostQuitMessage,

    易语言彗星载入线程窗口模块

    易语言彗星载入线程窗口模块源码,彗星载入线程窗口模块,彗星载入线程窗口,彗星销毁线程窗口,窗口线程,OnMessage,消息循环,CreateThread,GetMessage,DispatchMessage,TranslateMessage,PostQuitMessage,...

    易语言智能换肤演示(黑月版)源码,易语言智能换肤演示源码,易语言

    易语言智能换肤模块1.2源码,智能换肤模块1.2,WndProc,WinMain,主窗口创建完毕,帮助按钮被点击,菜单按钮被点击,PlaySound,BeginPaint,GetClientRect,DrawText,EndPaint,PostQuitMessage,DefWindowProc,LoadIcon,...

Global site tag (gtag.js) - Google Analytics