Sdílet prostřednictvím


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, OnIdlea 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.

Viz také

Obecná témata MFC