Zpracování smyčky nečinnosti
Mnoho aplikací provádět zdlouhavé zpracování "v pozadí." Důležité informace o výkonu diktovat někdy pomocí multithreading pro tuto práci.Podprocesy zahrnují nároky na další rozvoj, proto není vhodné používat pro jednoduché úkoly, například pracovní doby nečinnosti, která provádí knihovna MFC v "při nečinnosti" funkce.Tento článek se zaměřuje na zpracování nečinné.Další informace o multithreading, viz Multithreading Topics.
Některé druhy zpracování na pozadí jsou prováděny správně během intervalů, které uživatel není jinak interakci s aplikací.V aplikace vyvinutá pro operační systém Microsoft Windows aplikace provádět rozdělení do mnoha malých fragmentů zdlouhavý proces zpracování doby nečinnosti.Po zpracování každého fragmentu, poskytuje aplikace spuštění ovládacích prvků pomocí systému Windows PeekMessage smyčky.
Tento článek popisuje dva způsoby zpracování aplikace nečinnosti:
Pomocí PeekMessage v MFC hlavní smyčky zpráv.
Vložení jiného PeekMessage jinde v aplikaci opakovat.
PeekMessage ve smyčce zpráv knihovny MFC
Aplikace vyvinuté s knihovnou MFC, hlavní zpráva smyčky v CWinThread třída obsahuje smyčka zpráv, který volá PeekMessage rozhraní API systému Win32.Opakovat také volání OnIdle členské funkce CWinThread mezi zprávami.Aplikace může zpracovávat zprávy v tuto dobu nečinnosti přepsáním OnIdle funkce.
[!POZNÁMKA]
Spustit, OnIdle, a některých členských funkcí jsou nyní členy třídy CWinThread , nikoli z třídy CWinApp.CWinAppje odvozen od CWinThread.
Další informace o provádění zpracování nečinné, viz "při nečinnosti" v Odkaz knihovny MFC.
PeekMessage jinde v aplikaci
Jiné metody pro provádění nečinnosti zpracování v aplikaci zahrnuje vkládání smyčky zpráv v jednom ze své funkce.Tato smyčka zpráv se podobá MFC hlavní smyčky zpráv, naleznete v CWinThread::Run.To znamená, že smyčky aplikace vyvinuté pomocí MFC musí provádět mnoho stejných funkcí jako hlavní smyčky zpráv.Následující fragment kódu ukazuje zapisování smyčka zpráv, která je kompatibilní s knihovnou 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, dokud není nečinnosti zpracování provést.V rámci této smyčky vnořené smyčky opakovaně volá PeekMessage.Jak dlouho toto volání vrátí nenulovou hodnotu, smyčka volá CWinThread::PumpMessage provádět překlad normální zprávy a odeslání.I když PumpMessage je, můžete zkontrolovat jeho zdrojový kód v souboru ThrdCore.Cpp v adresáři \atlmfc\src\mfc instalace Visual C++.
Jednou vnitřní cyklus skončí, Vnější smyčka provádí nečinnosti zpracování pomocí jednoho nebo více volání na OnIdle.První volání je pro účely knihovny MFC.Můžete provést další volání na OnIdle na pozadí pracovat.
Další informace o provádění zpracování nečinné, viz "při nečinnosti" v odkazu knihovny MFC.