閒置迴圈處理
許多應用程式執行冗長的處理,「 在背景。"有時效能考量會規定使用多執行緒來的這些工作。 執行緒會牽涉額外的開發負擔,因此不建議使用簡單的工作,像是閒置時間的改善工作使 MFC 不像使用 OnIdle 函式。 這篇文章著重於閒置處理。 如需有關多執行緒處理,請參閱多執行緒主題。
使用者不互動與應用程式的時間間隔是適當的處理某些類型的幕後處理。 在 Microsoft Windows 作業系統所開發的應用程式,應用程式可以執行閒置時間處理將較長的處理序分割成許多小片段。 在處理每個片段,完後的應用程式會產生執行控制 Windows 使用 PeekMessage 迴圈。
本文將說明兩種方式可以執行閒置處理應用程式中:
使用 PeekMessage 在 MFC 的主訊息迴圈。
嵌入另一個 PeekMessage 循環播放,應用程式中其他地方。
在 [MFC 訊息迴圈的 PeekMessage
主訊息迴圈中使用 MFC 開發的應用程式中, CWinThread類別包含的訊息迴圈呼叫 PeekMessage Win32 API。 這也迴圈呼叫OnIdle成員函式的CWinThread之間的郵件。 應用程式可以藉由覆寫此閒置時間中處理訊息OnIdle函式。
注意事項 |
---|
執行, OnIdle,而且某些成員函式現在類別成員CWinThread而不是類別的CWinApp。CWinApp 是衍生自 CWinThread。 |
如需有關執行閒置處理的詳細資訊,請參閱 OnIdle 在 MFC 參考手冊 》。
在您的應用程式的其他地方的 PeekMessage
執行閒置處理應用程式中的另一個方式是使用嵌入您的函式的其中一個訊息迴圈。 這個訊息迴圈是非常類似於 MFC 的主訊息迴圈,在中找到 CWinThread::Run。 也就是說,使用 MFC 開發的應用程式中的這類的迴圈必須執行許多功能都與相同主訊息迴圈。 下列程式碼片段說明撰寫與 MFC 相容的訊息迴圈:
BOOL bDoingBackgroundProcessing = TRUE;
while (bDoingBackgroundProcessing)
{
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!AfxGetApp()->PumpMessage())
{
bDoingBackgroundProcessing = FALSE;
::PostQuitMessage(0);
break;
}
}
// let MFC do its idle processing
LONG lIdle = 0;
while (AfxGetApp()->OnIdle(lIdle++ ))
;
// Perform some background processing here
// using another call to OnIdle
}
這段程式碼內嵌函式中進行迴圈,只要有閒置處理来作。 執行迴圈,內巢狀的迴圈重複呼叫 PeekMessage。 只要該呼叫會傳回非零值,迴圈就會呼叫CWinThread::PumpMessage來執行一般訊息轉譯和分派。 雖然PumpMessage方法並未明文記載,您可以檢查其程式碼置於 ThrdCore.Cpp 檔案在您的 Visual C++ 安裝 \atlmfc\src\mfc 目錄中。
一旦內部迴圈結束,外部迴圈執行閒置處理與一或多個呼叫OnIdle。 第一次呼叫是 MFC 的用途。 您可以執行其他的呼叫,以OnIdle來進行背景工作。
如需有關執行閒置處理的詳細資訊,請參閱 OnIdle 在 MFC 程式庫參考手冊 》 中。