关于PostQuitMessage()的探究

本文深入探讨了PostQuitMessage函数的使用及引发的异常现象,分析了消息处理过程中的同步与异步问题,并通过示例代码说明了WM_QUIT消息如何影响消息循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于PostQuitMessage()的探究

转自: http://zhidao.baidu.com/question/100193141

从PostQuitMessage的异常现象 想到的消息处理函数的异步和同步问题

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
 static TCHAR szAppName[]=TEXT("Hello Win");
 static TCHAR szClassName[]=TEXT("HelloWinClass");
 HWND hwnd;
 MSG msg;
 WNDCLASS wndclass;
 wndclass.style =CS_HREDRAW|CS_VREDRAW;
 wndclass.lpfnWndProc =WndProc;
 wndclass.cbClsExtra =0;
 wndclass.cbWndExtra =0;
 wndclass.hInstance=hInstance;
 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);
 wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
 wndclass.lpszMenuName=NULL;
 wndclass.lpszClassName=szClassName;
 if(!RegisterClass(&wndclass))
 {
  MessageBox(NULL,TEXT("This Program requires Windows NT"),szAppName,MB_ICONERROR);
  return 0;

 }
 hwnd=CreateWindow(szClassName,
  TEXT("The HelloWin Program"),
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  NULL,
  NULL,
  hInstance,
  NULL);
 ShowWindow(hwnd,nCmdShow);
 UpdateWindow(hwnd);
 while(GetMessage(&msg,NULL,0,0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 return msg.wParam ;
}

 

回答:

这是MSDN上有关WM_QUIT的解释
This message does not have a return value because it causes the message loop to terminate before the message is sent to the application's window procedure. PostQuitMessage立即返回到MessageBox执行成功还是需要点时间的,这点时间已经足够让KERNEL把你的线程KILL了,即使刚好进入MessageBox代码处也没办法;;;不过按你那种做法理论上是应能显示出来的,但需要一个前提,系统内核的调度必须要足够慢……一般都不可能吧;;如果你反汇编跟踪一下,你会发现MessageBox的显示其实还是挺复杂的。
 ==============================================

问题补充:

你是说,这个WM_QUIT消息一旦发送到线程(不是窗口处理例程),线程就终止掉消息循环。导致下面的MessageBox语句无法执行。你的意思是不是这样。

但是这个程序是单线程的,如果不执行完WM_DESTROY的处理例程,线程哪里有机会检测到WM_QUIT消息已经在队列中并执行中止消息循环。难道你是说PostQuitMessage发出的WM_QUIT消息被异步处理掉了?

回答:

应该都不是那样,MessageBox是有执行到,但没显示,因为消息队列里有WM_QUIT消息了~~你跟踪一下会发现,MessageBox直接返回了


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值