关于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直接返回了