De informatie in dit artikel is van toepassing op:
- Microsoft Foundation Class Library 4.2
Dit artikel is eerder gepubliceerd onder NL99999
Samenvatting
Veel toepassingen voeren langdurige bewerkingen 'op de achtergrond' uit op ogenblikken dat de gebruiker niet op andere wijze met de toepassing werkt. In een toepassing die ontwikkeld is voor het besturingssysteem Microsoft Windows, kunnen bewerkingen op de achtergrond worden uitgevoerd door een langdurig proces op te splitsen in kleine fragmenten. Na de verwerking van elk fragment, draagt de toepassing het beheer van de uitvoering over aan Windows via een PeekMessage()-lus.
Een toepassing die is ontwikkeld met de Microsoft Foundation Class-bibliotheek, kan op twee manieren bewerkingen op de achtergrond uitvoeren: via de PeekMessage()-lus in de hoofdberichtlus van de bibliotheekcode of door een andere PeekMessage()-lus in de toepassing in te sluiten.
OPMERKING: de voorbeeldcode die verderop in dit artikel wordt weergegeven, heeft betrekking op Visual C++ voor Windows en Visual C++ 32-bit Edition, versie 2.x. Raadpleeg voor C++ 32-bit Edition versie 4.0 de veelgestelde vragen (FAQ) over "Background Processing in an MFC Application" (achtergrondverwerking in een MFC-toepassing) in de on line-handleidingen van Visual C++ 4.0.Meer informatie
In een toepassing die ontwikkeld is met de Microsoft Foundation Class-bibliotheek, bevat de hoofdberichtlus in de CwinApp-klasse een PeekMessage()-lus. Deze lus roept de functie CWinApp::OnIdle() aan tussen twee berichten. Een toepassing kan gedurende de periodes van inactiviteit berichten verwerken door de functie OnIdle() te overschrijven. Raadpleeg de documentatie over de functie CWinApp::OnIdle() in het handboek "Class Libraries Reference" voor meer informatie over het uitvoeren van achtergrondverwerking met de functie OnIdle().
Een andere methode voor het uitvoeren van achtergrondverwerking in een toepassing, is door een PeekMessage()-lus in een functie in te bouwen. Een PeekMessage()-lus lijkt op de hoofdberichtlus en moet dus in een toepassing die ontwikkeld is met de Microsoft Foundation Class-bibliotheek veel van de functies van de hoofdberichtlus in de bibliotheek uitvoeren. Het volgende codefragment vormt een voorbeeld van een PeekMessage()-lus die compatibel is met de Microsoft Foundation Class-bibliotheek:
while (bDoingBackgroundProcessing) { while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { bDoingBackgroundProcessing = FALSE; ::PostQuitMessage(nExitCode); break; } if (!AfxGetApp()->PreTranslateMessage(&msg)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } AfxGetApp()->OnIdle(0); // werkt de gebruikersinterface bij AfxGetApp()->OnIdle(1); // maakt tijdelijke objecten vrij
// Voer hier achtergrondbewerkingen uit // Als de taak op de achtergrond voltooid is, // stel bDoingBackgroundProcessing in op FALSE }