In een van mijn programma's voer ik een statistische simulatie uit. Die simulatie wordt simultaan uitgevoerd over meerdere threads om het proces zo snel mogelijk te laten verlopen. De voortgang van de berekening (die lang kan duren) wordt weergeven in de UI thread; het 'probleem' is echter dat het updaten daarvan schokkerig verloopt, terwijl de UI thread verder echt niets te doen heeft (of beter gezegd: zou moeten hebben...?). Ik vermoed dat ik dus toch wat over het hoofd zie, en ik wil graag weten hoe dat komt 
Ik heb een klasse Progress in mijn 'domein' laag zitten waar de afzonderlijke threads hun voortgang aan rapporteren. Progress heeft op dit moment slechts een maximum, een countertje (bij iedere voltooide iteratie wordt het countertje één verhoogd) en een status (inactive, waiting, working, killed, finished, etc).
Op de UI thread start ik een DialogBox. Die maakt twee threads aan: één thread Work voor het starten van de berekening (die op haar beurt weer de berekening weer opsplitst in een x aantal threads) en één thread Status die verantwoordelijk is voor het checken van de voortgang van de berekening. Thread Status doet niets anders dan iedere 10ms kijken wat het huidige aantal voltooide iteraties is en, als die gewijzigd is, de DialogBox haar progressbar laten updaten. De iteraties verlopen dusdanig snel dat er minstens 500 iteraties verwerkt worden in een seconde, dus iedere 10ms is er voldoende voortgang weer te geven.
Als ik één model doorreken (twee threads, één op elke core) dan verloopt het updaten regelmatig - althans, zo lijkt het. Als ik meer modellen doorreken (2 threads voor elk model) dan verloopt het updaten schokkerig. Dat snap ik echter niet, omdat ik slechts iedere 10ms een update uitvoer van de progressbar -los van hoe vaak de verschillende threads klasse Progress bijwerken- en de UI thread heeft volgens mij verder niets te doen. Het gebeurt nu dat de balk soms seconden stil blijft staan, om dan ineens 25% te verspringen.
Wat zie ik over het hoofd? Alvast bedankt
Ik heb een klasse Progress in mijn 'domein' laag zitten waar de afzonderlijke threads hun voortgang aan rapporteren. Progress heeft op dit moment slechts een maximum, een countertje (bij iedere voltooide iteratie wordt het countertje één verhoogd) en een status (inactive, waiting, working, killed, finished, etc).
Op de UI thread start ik een DialogBox. Die maakt twee threads aan: één thread Work voor het starten van de berekening (die op haar beurt weer de berekening weer opsplitst in een x aantal threads) en één thread Status die verantwoordelijk is voor het checken van de voortgang van de berekening. Thread Status doet niets anders dan iedere 10ms kijken wat het huidige aantal voltooide iteraties is en, als die gewijzigd is, de DialogBox haar progressbar laten updaten. De iteraties verlopen dusdanig snel dat er minstens 500 iteraties verwerkt worden in een seconde, dus iedere 10ms is er voldoende voortgang weer te geven.
Als ik één model doorreken (twee threads, één op elke core) dan verloopt het updaten regelmatig - althans, zo lijkt het. Als ik meer modellen doorreken (2 threads voor elk model) dan verloopt het updaten schokkerig. Dat snap ik echter niet, omdat ik slechts iedere 10ms een update uitvoer van de progressbar -los van hoe vaak de verschillende threads klasse Progress bijwerken- en de UI thread heeft volgens mij verder niets te doen. Het gebeurt nu dat de balk soms seconden stil blijft staan, om dan ineens 25% te verspringen.
Wat zie ik over het hoofd? Alvast bedankt
Geef mij maar een Warsteiner.