Ik ben bezig met een WTL programma wat op een verzameling files bewerkingen uitvoert. Dit kan enige tijd duren en in de tussentijd wil ik graag dat status dialog waarop onderandere een console (listbox met icoontjes) en een progress bar staan up-to-date blijft. Deze controls (CProgressBarCtrl en CListViewCtrl) zijn private members van mijn CDialogImpl derived class en hebben allebei een bijbehorende public method om hun status te updaten.
Tot nu toe heb ik voor dit probleem twee oplossingen kunnen bedenken.
1] stop het hele file processing gedeelte in een aparte worker thread (de mooiste maar ook ingewikkeldste oplossing)
2] laat het programma singlethreaded en geef het processing gedeelte een callback functie mee die om de zoveel tijd de controls op de status dialog update en dan CWindow::RedrawWindow() aanroept.
Mijn voorkeur gaat toch uit naar de eerste methode maar het probleem hier is dat ik erg weinig informatie kan vinden over hoe je nou vanuit een worker thread op een correcte manier met een UI thread communiceert. Op dit moment heb het zo dat de worker thread direct de methoden voor het updaten van de progressbar en console aanroept, maar volgens mij is dat niet de veiligste manier (alhoewel het in normaal gebruik goed lijkt te gaan). Dit heb ik al gelijk gemerkt toen ik in mijn dialog een cancel button wilde toevoegen die via WaitForSingleOjbect() wacht tot de thread klaar is (of in dit geval afgebroken wordt) voordat het dialog window verwijderd wordt (want de worker thread roept daar dus methoden van aan). Maar dat resulteert in een deadlock.
Mijn vraag is dus eigenlijk, wat is nou de correcte en veilige manier om vanuit een worker thread status updates door te geven aan een UI thread? Ik heb veel op Google gezocht maar ik kom weinig concreet nuttige resultaten tegen. Voornamelijk veel MFC multithreading tutorials met veel code en weinig uitleg.
Als iemand hier een antwoord op weet of misschien wat linkjes heeft naar nuttige multi-threading tutorials (in mijn ogen zijn nuttige tutorials dus voornamelijk uitleg en niet zo zeer lappen met code) hoor ik het graag.
Tot nu toe heb ik voor dit probleem twee oplossingen kunnen bedenken.
1] stop het hele file processing gedeelte in een aparte worker thread (de mooiste maar ook ingewikkeldste oplossing)
2] laat het programma singlethreaded en geef het processing gedeelte een callback functie mee die om de zoveel tijd de controls op de status dialog update en dan CWindow::RedrawWindow() aanroept.
Mijn voorkeur gaat toch uit naar de eerste methode maar het probleem hier is dat ik erg weinig informatie kan vinden over hoe je nou vanuit een worker thread op een correcte manier met een UI thread communiceert. Op dit moment heb het zo dat de worker thread direct de methoden voor het updaten van de progressbar en console aanroept, maar volgens mij is dat niet de veiligste manier (alhoewel het in normaal gebruik goed lijkt te gaan). Dit heb ik al gelijk gemerkt toen ik in mijn dialog een cancel button wilde toevoegen die via WaitForSingleOjbect() wacht tot de thread klaar is (of in dit geval afgebroken wordt) voordat het dialog window verwijderd wordt (want de worker thread roept daar dus methoden van aan). Maar dat resulteert in een deadlock.
Mijn vraag is dus eigenlijk, wat is nou de correcte en veilige manier om vanuit een worker thread status updates door te geven aan een UI thread? Ik heb veel op Google gezocht maar ik kom weinig concreet nuttige resultaten tegen. Voornamelijk veel MFC multithreading tutorials met veel code en weinig uitleg.
Als iemand hier een antwoord op weet of misschien wat linkjes heeft naar nuttige multi-threading tutorials (in mijn ogen zijn nuttige tutorials dus voornamelijk uitleg en niet zo zeer lappen met code) hoor ik het graag.