CWinApp::OnIdle
覆寫這個成員函式執行閒置時間處理。
virtual BOOL OnIdle(
LONG lCount
);
參數
- lCount
已加入的計數器,每次 OnIdle 呼叫,以便將應用程式的訊息佇列是空的。 每次新訊息處理常式,這個計數器會重設為 0。 您可以使用 lCount 參數判斷應用程式處於閒置狀態,而不需處理訊息的相對時間。
傳回值
非零接收更閒置處理時間,0,如果沒有其他閒置時間是不需要的。
備註
指出應用程式的訊息佇列是空的時,OnIdle 在預設訊息迴圈呼叫。 使用您的覆寫會呼叫您的背景閒置處理序工作。
OnIdle 應傳回 0 表示不需要處理時間延遲。 lCount 參數會加入 OnIdle ,每次呼叫時,訊息佇列是空的且重設為 0 時新訊息每次處理。 您可以用自己的 Variant 閒置處理常式根據這個計數。
下列摘錄閒置迴圈 (Loop) 處理:
如果在 MFC 程式庫的訊息迴圈檢查訊息佇列並不會發現擱置訊息,它會呼叫應用程式物件的 OnIdle 並提供 0 做為 lCount 引數。
OnIdle 執行處理的部分,而且必須重新呼叫傳回表示其非零值做進一步處理。
訊息迴圈檢測重複訊息佇列。 如果訊息沒有暫止時,它會呼叫 OnIdle ,將 lCount 引數。
最後, OnIdle 完成處理所有它閒置工作並傳回 0。 這會讓訊息迴圈停止呼叫 OnIdle ,直到下一個訊息從佇列接收訊息,此時,閒置期間重新啟動與引數設為 0。
不要執行冗長工作在 OnIdle 期間,由於應用程式無法處理使用者輸入,直到 OnIdle 傳回。
注意事項 |
---|
OnIdle 的預設實作會更新命令使用者介面物件 (例如功能表項目和工具列按鈕,,並且會執行內部資料結構清除。因此,如果您覆寫, OnIdle,您必須呼叫 CWinApp::OnIdle 和您的覆寫版本的 lCount 。第一次呼叫任何基底類別閒置處理 (也就是在基底類別 OnIdle 傳回 0)。如果您所執行的工作,在基底類別程序完成之前,請先檢閱基底類別實作選取期間完成工作的適當 lCount 在。 |
如果您不想 OnIdle 呼叫,並在訊息從訊息佇列中擷取,您可以覆寫 CWinThreadIsIdleMessage。 如果應用程式將非常少運算計時器,或者,如果系統 WM_SYSTIMER 傳送訊息,然後 OnIdle 會重複呼叫,並降低效能。
範例
下列兩個範例顯示如何使用 OnIdle。 第一個範例會處理兩個閒置工作使用 lCount 引數設定優先權的工作。 第一項工作是高優先順序,因此,您應該會盡可能。 才會在使用者輸入時,的長度、第二個工作較不重要,而且應採取的動作。 請注意這個呼叫 OnIdle基底類別版本。 第二個範例處理閒置工作的一組不同的優先權。
BOOL CMyApp::OnIdle(LONG lCount)
{
BOOL bMore = CWinApp::OnIdle(lCount);
if (lCount == 0)
{
TRACE(_T("App idle for short period of time\n"));
bMore = TRUE;
}
else if (lCount == 10)
{
TRACE(_T("App idle for longer amount of time\n"));
bMore = TRUE;
}
else if (lCount == 100)
{
TRACE(_T("App idle for even longer amount of time\n"));
bMore = TRUE;
}
else if (lCount == 1000)
{
TRACE(_T("App idle for quite a long period of time\n"));
// bMore is not set to TRUE, no longer need idle
// IMPORTANT: bMore is not set to FALSE since CWinApp::OnIdle may
// have more idle tasks to complete.
}
return bMore;
// return TRUE as long as there are any more idle tasks
}
第二個範例
// In this example, four idle loop tasks are given various
// opportunities to run:
// Task1 is always given a chance to run during idle time, provided
// that no message has queued up while the framework was processing
// its own idle loop tasks (at lCount levels 0 and 1).
// Task2 is given a chance to run only if Task1 has already run,
// provided that no message has queued up while Task1 was running.
// Task3 and Task4 are given a chance to run only if both Task1 and
// Task2 have already run, and no message has queued up in the mean
// time. If Task3 gets its chance to run, then Task4 always gets
// a chance to run immediately after Task3.
BOOL CMyWinApp::OnIdle(LONG lCount)
{
// In this example, as in most applications, you should let the
// base class CWinApp::OnIdle complete its processing before you
// attempt any additional idle loop processing.
if (CWinApp::OnIdle(lCount))
return TRUE;
// The base class CWinApp::OnIdle reserves the lCount values 0
// and 1 for the framework's own idle processing. If you wish to
// share idle processing time at a peer level with the framework,
// then replace the above if-statement with a straight call to
// CWinApp::OnIdle; and then add a case statement for lCount value
// 0 and/or 1. Study the base class implementation first to
// understand how your idle loop tasks will compete with the
// framework's idle loop processing.
switch (lCount)
{
case 2:
Task1();
return TRUE; // next time give Task2 a chance
case 3:
Task2();
return TRUE; // next time give Task3 and Task4 a chance
case 4:
Task3();
Task4();
return FALSE; // cycle through the idle loop tasks again
}
return TRUE;
}
需求
Header: afxwin.h