在單線程應用中,我們知道,當程序進入某個需要長時間處理的函數A的時候,系統將不會響應用戶的各種操作包括關閉應用程序,程序將進入假死狀態,也就是界面停止響應其他操作。
關於C#可以直接在while循環里調用Application.DoEvents();
1 bool IsStart=false 2 3 while(!IsStart) 4 { 5 //事件; 6 Application.DoEvents(); 7 } 8 9 //IsStart可在其他按鈕或同一按鈕下改變為true 即結束此循環
關於C++中MFC里做界面,也是我現在遇到的問題,可以如下解決:
1.同上面C#一樣,把Application.DoEvents(),換成C++中的:AfxGetApp()->PumpMessage();
2.創建一個DoEvent函數,同樣把C#例子中的替換掉就行了:
1 //事件處理函數,鑲入到循環中,使得其它消息有機會得到處理 2 3 BOOL DoEvents() 4 { 5 MSG msg; 6 ::GetMessage(&msg,0,0, 0); 7 if (msg.message == WM_QUIT) 8 { 9 PostQuitMessage(msg.wParam); 10 return FALSE; 11 } 12 else 13 { 14 ::TranslateMessage(&msg); 15 ::DispatchMessage(&msg); 16 return TRUE; 17 } 18 }
在網上查了好多資料,基本都是創建一個DoEvent,今天偶然發現了方法1
分享出來給大家。如有錯誤還望指正。