CWinApp::OnIdle
Potlačit toto členské funkce provádět zpracování doba nečinnosti.
virtual BOOL OnIdle(
LONG lCount
);
Parametry
- lCount
Čítač je zvýšen pokaždé, když OnIdle je volána, když aplikace fronta je prázdná.Tento počet je vynulováno pokaždé, když je nová zpráva zpracována.Můžete použít lCount parametr určit relativní dobu aplikace nečinný bez zpracování zprávy.
Vrácená hodnota
Nenulová přijímat další zpracování nečinnosti; 0, pokud je zapotřebí žádné další nečinnosti.
Poznámky
OnIdleje volána smyčku výchozí zprávu, když aplikace fronta je prázdná.Pomocí přepsat vaše vlastní pozadí volání nečinné zpracování úlohy.
OnIdleměla vrátit hodnotu 0 k označení nepožaduje žádné zpracování nečinnosti. lCount Parametr je zvýšen pokaždé, když OnIdle je volána, když fronty zpráv je prázdná a obnoví 0 při každém zpracování nové zprávy.Můžete zavolat do různých nečinnosti rutiny na základě tohoto počtu.
Shrnuje nečinnosti smyčku zpracování:
Smyčka zpráv v knihovně Microsoft Foundation Class fronty zprávy zkontroluje a najde žádné čekající zprávy, volá OnIdle pro objekt aplikace a dodávky 0 jako lCount argument.
OnIdleprovádí některé zpracování a vrátí nenulovou hodnotu označující, že by měla být volána znovu provést další zpracování.
Smyčka zpráv znovu zkontroluje fronty zprávy.Pokud žádné zprávy čekající na vyřízení, volá OnIdle opět nezvyšuje lCount argument.
Nakonec OnIdle dokončí zpracování všech nečinných úloh a vrátí hodnotu 0.To říká smyčka zpráv zastavit volání OnIdle až do přijetí další zprávy z fronty zpráv, po jehož nečinnosti cyklu restartuje s argument nastaven na hodnotu 0.
Neprovádějte dlouhé úkoly během OnIdle protože aplikace nemůže zpracovat vstup do OnIdle vrátí.
[!POZNÁMKA]
Výchozí implementace OnIdle aktualizace příkazu objekty uživatelského rozhraní jako položky nabídky a tlačítka panelů nástrojů a provádí čištění struktury vnitřních dat.Proto pokud potlačíte OnIdle , musí volat CWinApp::OnIdle se lCount ve změněné verze.První volání nečinné všechny základní třída zpracování (, dokud základní třídy OnIdle vrátí hodnotu 0).Pokud potřebujete provádět práce před dokončením zpracování základní třída, přezkoumávat provádění základní třída vyberte správné lCount během kterého k práci.
Pokud nechcete, aby OnIdle má být volána při načítání zpráv z fronty zpráv, můžete přepsat CWinThreadIsIdleMessage.Aplikace má nastavit časovač velmi krátké nebo systém odesílá WM_SYSTIMER zpráva pak OnIdle bude volán opakovaně a snížit výkon.
Příklad
Následující dva příklady ukazují způsob použití OnIdle .První příklad zpracovává dvě nečinné úlohy pomocí lCount argument priority úkolů.Prvním úkolem je nejdůležitější a měli byste tak učinit kdykoli je to možné.Druhý úkol je méně důležité a musí být provedeno pouze v případě, že delší pauze v vstup uživatele.Poznámka: volání verzi základní třída OnIdle .Druhý příklad spravuje skupinu nečinné úlohy s různými prioritami.
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
}
Druhý příklad
// 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;
}
Požadavky
Záhlaví: afxwin.h