Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Toepassingen met meerdere threads vereisen strengere zorg dan toepassingen met één thread om ervoor te zorgen dat bewerkingen plaatsvinden in de beoogde volgorde en dat gegevens die door meerdere threads worden geopend, niet beschadigd zijn. In dit onderwerp worden technieken beschreven voor het voorkomen van potentiële problemen bij het programmeren van multithreaded toepassingen met de MFC-bibliotheek (Microsoft Foundation Class).
Communiceren tussen threads
Toegang tot objecten vanuit meerdere threads
MFC-objecten zijn zelf niet thread-veilig. Twee afzonderlijke threads kunnen hetzelfde object niet bewerken, tenzij u de MFC-synchronisatieklassen en/of de juiste Win32-synchronisatieobjecten gebruikt, zoals kritieke secties. Zie Synchronisatie in de Windows SDK voor meer informatie over kritieke secties en andere gerelateerde objecten.
De klassebibliotheek maakt intern gebruik van kritieke secties om globale gegevensstructuren te beveiligen, zoals de secties die worden gebruikt door de toewijzing van geheugen voor foutopsporing.
Toegang tot MFC-objecten vanuit niet-MFC-threads
Als u een multithreaded-toepassing hebt waarmee een thread op een andere manier wordt gemaakt dan het gebruik van een CWinThread-object , hebt u geen toegang tot andere MFC-objecten van die thread. Met andere woorden, als u toegang wilt krijgen tot een MFC-object vanuit een secundaire thread, moet u die thread maken met een van de methoden die worden beschreven in Multithreading: User-Interface Threads of Multithreading: Creating Worker Threads. Deze methoden zijn de enige methoden waarmee de klassebibliotheek de interne variabelen kan initialiseren die nodig zijn om multithreaded toepassingen te verwerken.
Windows Handlekaarten
Als algemene regel heeft een thread alleen toegang tot MFC-objecten die het zelf heeft aangemaakt. Dit komt doordat tijdelijke en permanente Windows-ingangstoewijzingen worden bewaard in de lokale threadopslag om de beveiliging van gelijktijdige toegang vanuit meerdere threads te behouden. Een worker thread kan bijvoorbeeld geen berekening uitvoeren en vervolgens de lidfunctie van een document UpdateAllViews aanroepen om de vensters die weergaven op de nieuwe gegevens bevatten, te laten wijzigen. Dit heeft helemaal geen effect, omdat de kaart van CWnd objecten naar HWND's lokaal is voor de primaire thread. Dit betekent dat één thread mogelijk een toewijzing heeft van een Windows-ingang naar een C++-object, maar een andere thread kan dezelfde ingang toewijzen aan een ander C++-object. Wijzigingen die in de ene thread zijn aangebracht, worden niet doorgevoerd in de andere thread.
Er zijn verschillende manieren om dit probleem te omzeilen. De eerste is het doorgeven van afzonderlijke handles (zoals een HWND) in plaats van C++-objecten aan de werkthread. De worker thread voegt deze objecten vervolgens toe aan zijn tijdelijke map door de juiste FromHandle lidfunctie aan te roepen. U kunt het object ook toevoegen aan de permanente kaart van de thread door aan te roepen Attach, maar dit moet alleen worden gedaan als u zeker weet dat het object langer bestaat dan de thread.
Een andere methode is het maken van nieuwe door de gebruiker gedefinieerde berichten die overeenkomen met de verschillende taken die uw werkrolthreads uitvoeren en deze berichten posten in het hoofdvenster van de toepassing met behulp van ::PostMessage. Deze communicatiemethode is vergelijkbaar met twee verschillende toepassingen, behalve dat beide threads in dezelfde adresruimte worden uitgevoerd.
Zie Technische opmerking 3 voor meer informatie over handle maps. Zie Thread Local Storage en Thread Local Storage gebruiken in de Windows SDK voor meer informatie over lokale threadopslag.
Communiceren tussen threads
MFC biedt een aantal klassen waarmee threads de toegang tot objecten kunnen synchroniseren om threadveiligheid te behouden. Het gebruik van deze klassen wordt beschreven in Multithreading: De synchronisatieklassen en multithreading gebruiken: wanneer u de synchronisatieklassen gebruikt. Zie Synchronisatie in de Windows SDK voor meer informatie over deze objecten.