本文共 834 字,大约阅读时间需要 2 分钟。
setmessage()&postmessage()[问题]: 比如我在 OnButton1中写上: void OnButton1() { ::SetWindowText( this->GetSafeHwnd(), "abc" ); gEnableQuit = true; // gEnableQuit已经被volatile修饰过 } 我就觉得很奇怪 SetWindowText 使用的是 SendMessage(WM_TEXT),而 SendMessage 需要等待消息被处理后才返回,而此时又正在处理 WM_BUTTON1,不等处理完WM_BUTTON1它是不处理WM_TEXT的,可是不处理WM_TEXT的话,SendMessage就一直在等, 这就引起死锁。但事实上并没有死锁;假如这个OnButton1被另一个线程调用着,而此时用户发出了退出消息,退出代码如下: OnDestroy { while( !gEnableQuit ) Sleep( 500 ); } 这就会引起死锁,原因就是我刚才所说的疑惑,在 SetWindowText 处死锁。 [解答] PostMessage是把WM_XX送到消息队列中,而SendMessage根本不经过消息队列,其实就是直接Call 窗口对应的消息函数,下面是SendMessage的内核代码: SendMessage(hWnd,message,wParam,lParam) { WNDPROC pPrevWndFunc = GetWindowLong(hWnd,GWL_WNDPROC); return CallWndProc(pPrevWndFunc,hWnd,message,wParam,lParam); } 因此,你OnButton1()模块中的SetWindowText(),直接调用了SendMessage,而SendMessage直接调用了WndProc()。子程序调用子程序,不存在所谓死锁的问题转载地址:http://ixdqi.baihongyu.com/