Na een tijdje van inactiviteit heb ik de ontwikkeling van mijn CPU benchmarktapplicatie weer eens opgepakt. Nu wil ik met de huidige ontwikkelingen (HT, dual cpu systemen, etc.) ook een multithreaded test. Dat heb ik netjes aan de gang, de user kan het aantal threads opgeven (standaard 2) en die worden gewoon gestart. Daarmee gaat het allemaal goed, alleen ik wil de knop waarmee de test wordt gestart disabled houden totdat alle threads klaar zijn.
Ik heb verschillende stukjes code geprobeerd, waaronder getExitCodethread() uit dit topic, en WaitForMultipleObjects() uit dit artikel.
Met WaitForMultipleObjects() heb ik de volgende code gebakken:
De knop wordt netjes gedisabled maar nooit meer enabled. Als ik een application.messagebox() voor en achter WaitForMultipleObjects() plaats worden die wel alle 2 weergegeven, alleen wordt de laatste meteen na de eerste weergegeven, dus terwijl de threads nog runnen. Hoe komt dit en hoe kan ik ervoor zorgen dat mijn button wel weer enabled wordt op het juiste moment?
MSDN WaitForMultipleObjects() documentatie
Ik heb verschillende stukjes code geprobeerd, waaronder getExitCodethread() uit dit topic, en WaitForMultipleObjects() uit dit artikel.
Met WaitForMultipleObjects() heb ik de volgende code gebakken:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| procedure TfrmMain.btnStartClick(Sender: TObject); var test: array of Ttest_thread; handles: array of Thandle; i: integer; begin //lengte van de array's zetten: setlength(test, strtoInt(maskeditThreads.Text)); setlength(handles, strtoInt(maskeditThreads.Text)); memoTest.Clear; btnStart.Enabled:=false; statusBar.SimpleText:= 'Running...'; application.ProcessMessages; for i:=0 to (strtoInt(maskeditThreads.Text)-1) do begin test[i] := Ttest_thread.Create(true); test[i].Fmax:= strtoInt(maskeditGenerations.text); test[i].Thread_id:=i; test[i].FreeOnTerminate:= true; test[i].Resume; handles[i]:= test[i].Handle; end; WaitForMultipleObjects(i, @handles, True, INFINITE); btnStart.Enabled:=true; statusBar.SimpleText:= 'Ready.'; end; |
De knop wordt netjes gedisabled maar nooit meer enabled. Als ik een application.messagebox() voor en achter WaitForMultipleObjects() plaats worden die wel alle 2 weergegeven, alleen wordt de laatste meteen na de eerste weergegeven, dus terwijl de threads nog runnen. Hoe komt dit en hoe kan ik ervoor zorgen dat mijn button wel weer enabled wordt op het juiste moment?
MSDN WaitForMultipleObjects() documentatie
[ Voor 7% gewijzigd door AtleX op 12-12-2004 19:41 ]
Sole survivor of the Chicxulub asteroid impact.