在VC++中,碰到了比如等待通訊數據等需要很長時間的循環時,在循環里加入類似VB的DoEvents函數,使畫面一直處於事件響應狀態。實際上,DoEvents函數的內容就是一個窗口消息處理環。
void DoEvents()
{
MSG msg;
while(::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE))
{
if (!AfxGetApp()->PumpMessage())
return;
}
}
或
void DoEvents()
{
MSG msg;
while (::GetMessage(&msg, NULL, NULL, NULL))
{
if (!PreTranslateMessage(&msg))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
}
注意點:這種方法在長時間的循環処理中能不斷進行畫面操作,可以說這個DoEvents手法還是挺方便的。可是在DoEvents()中,
任何Windows的消息多可能被處理,有時出現了預料不到的結果。所以,儘可能使用下面函數中的wMsgFilterMin和wMsgFilterMax參數,
對處理的消息種類作適當制限,編出更加安全的DoEvents()。
BOOL PeekMessage( LPMSG lpMsg, // pointer to structure for message
HWND hWnd, // handle to window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax, // last message
UINT wRemoveMsg // removal flags
);
BOOL GetMessage( LPMSG lpMsg, // address of structure with message
HWND hWnd, // handle of window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax // last message
);
最後一句話:如果是長時間循環處理,使用多線程!