Zpracování smyčky nečinnosti
Mnoho aplikací provádí zdlouhavé zpracování "na pozadí". Někdy je potřeba zvážit výkon při použití vícevláknového formátování pro takovou práci. Vlákna zahrnují dodatečné režijní náklady na vývoj, takže se nedoporučuje pro jednoduché úlohy, jako je doba nečinnosti, kterou mfc dělá ve funkci OnIdle . Tento článek se zaměřuje na nečinné zpracování. Další informace o multithreadingu naleznete v tématu Vícevláknová témata.
Některé druhy zpracování na pozadí se správně provádějí v intervalech, kdy uživatel jinak s aplikací nekomuaguje. V aplikaci vyvinuté pro operační systém Microsoft Windows může aplikace provádět zpracování v nečinnosti rozdělením zdlouhavého procesu na mnoho malých fragmentů. Po zpracování každého fragmentu aplikace získá řízení provádění systému Windows pomocí smyčky PeekMessage .
Tento článek vysvětluje dva způsoby zpracování nečinnosti v aplikaci:
Použití funkce PeekMessage v hlavní smyčce zpráv MFC
Vložení další smyčky PeekMessage někam jinam v aplikaci
Náhled zprávy ve smyčce zpráv MFC
V aplikaci vyvinuté pomocí knihovny MFC obsahuje hlavní smyčka zpráv ve CWinThread
třídě smyčku zpráv, která volá rozhraní API Win32 PeekMessage . Tato smyčka také volá OnIdle
členovu CWinThread
funkci mezi zprávami. Aplikace může zpracovávat zprávy v této době nečinnosti přepsáním OnIdle
funkce.
Poznámka
Run
, OnIdle
a některé další členské funkce jsou nyní členy třídy CWinThread
místo třídy CWinApp
. CWinApp
je odvozen z CWinThread
.
Další informace o provádění nečinných zpracování naleznete v tématu OnIdle v referenční dokumentaci MFC.
PeekMessage Elsewhere in Your Application
Další metodou provádění nečinného zpracování v aplikaci je vložení smyčky zpráv do jedné z vašich funkcí. Tato smyčka zpráv je velmi podobná hlavní smyčce zpráv MFC, která se nachází v CWinThread::Run. To znamená, že taková smyčka v aplikaci vyvinuté pomocí mfc musí provádět mnoho stejných funkcí jako hlavní smyčka zpráv. Následující fragment kódu ukazuje zápis smyčky zpráv, která je kompatibilní s 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
}
Tento kód vložený do funkce smyčky, pokud existuje nečinné zpracování. V rámci této smyčky se vnořená smyčka opakovaně volá PeekMessage
. Pokud volání vrátí nenulovou hodnotu, volání CWinThread::PumpMessage
smyčky pro provádění normálního překladu a odesílání zpráv. I když PumpMessage
není dokumentovaný, můžete jeho zdrojový kód prozkoumat v souboru ThrdCore.Cpp v adresáři \atlmfc\src\mfc instalace Visual C++.
Jakmile vnitřní smyčka skončí, vnější smyčka provede nečinné zpracování s jedním nebo více voláními OnIdle
. První volání je určené pro účely mfc. Můžete provést další volání, abyste OnIdle
mohli provádět vlastní práci na pozadí.
Další informace o provádění nečinných zpracování naleznete v tématu OnIdle v knihovně MFC Reference.