![]() |
Prüfen wann alle Threads beendet wurden
Hallo,
ich habe leider ein kleines problem mit threads die ich in einer schleife im hauptprogramm erzeuge, jeder thread berechnet bestimmte werte und gibt diese an das hauptprogramm zurück wo sie dann in einer stringliste gespeichert werden, das funktioniert auch alles wunderbar, nur leider weiß ich nun nicht genau wie ich prüfen kann ob alle aktionen die in den x threads y mal neu berechnet wurden beendet sind und ich somit die stringliste lokal speichern kann mein ansatz war nun folgender:
Delphi-Quellcode:
hat jemand dazu vielleicht eine idee?
//schleife im hauptprogramm die x threads
//immer wieder mit y neuen daten versorgt while {????????????????} do Application.ProcessMessages; |
Re: Prüfen wann alle Threads beendet wurden
nimmst du den vcl thread oder den api thread?
du kannst bei letzterer methode die handles der threads abspeichern und überprüfen, ob es noch existiert oder nicht! |
Re: Prüfen wann alle Threads beendet wurden
das ist eine gute frage, auf die ich leider so gar keine
antwort habe, ich halte mich dabei immer an die beispiele von luckie die threads erzeuge ich wie folgt:
Delphi-Quellcode:
welche der beiden methoden das nun darstellt weiß ich
Setlength(ThreadArray, StrToInt(edtThreads.Text));
while Mylist.Count-1 > 0 do begin for i := 0 to length(ThreadArray) - 1 do begin ThreadArray[i] := TMyThreads.Create(true); ThreadArray[i].FIndex := i; ThreadArray[i].FValue := Mylist[0]; ThreadArray[i].Priority := tpIdle; ThreadArray[i].FreeOnTerminate := True; ThreadArray[i].Resume; Mylist.Delete(0); end; end; eigentlich gar nicht :( |
Re: Prüfen wann alle Threads beendet wurden
![]() |
Re: Prüfen wann alle Threads beendet wurden
hmm, kann ich leider nichts mit anfangen,
das forum bringt dazu leider auch kaum hilfreiche informationen |
Re: Prüfen wann alle Threads beendet wurden
Dann kuck in mein Threading Tutorial, da hab eich was dazu geschrieben und ein Demo gemacht.
|
Re: Prüfen wann alle Threads beendet wurden
also erstmal danke euch beiden für eure hilfe :)
luckie ich hab mir gerade nocheinmal deine pdf dazu angeschaut und da steht nun was von "->Demo: WaitForMultipleObjects", bezieht sich das jetzt auf den nachfolgenden Beitrag in der pdf oder gibt es da einen Source zum Download der bei mir nicht aktiv ist? |
Re: Prüfen wann alle Threads beendet wurden
naja ich geh mal nun davon aus das es dort keinen source gibt,
leider sind die angaben in deinem tutorial zu hoch für mich, damit kann ich als nicht informatiker und einsteiger nicht viel anfangen, auch bei google und in den bekannten delphi foren sind dazu nur brüchstücke zu finden, aber keine beispiele :( |
Re: Prüfen wann alle Threads beendet wurden
Zitat:
Zitat:
![]() Zitat:
|
Re: Prüfen wann alle Threads beendet wurden
Zitat:
|
Re: Prüfen wann alle Threads beendet wurden
hallo,
ich hab das ganze nun mal mit WaitForMultipleObjects probiert, allerdings scheint hier nicht wirklich gewartet zu werden =( mein code ist folgender:
Delphi-Quellcode:
jemand eine idee wo nun der denkfehler ist?
procedure TMainForm.LunchThreadds;
var i: integer; Mylist: TStringlist; hndlArray : Array of THandle; begin ... //erstmal wird Mylist eingelesen und geschaut ob noch threads laufen ... Setlength(MyThreadArray, StrToInt(edtThreads.Text)); Setlength(hndlArray, StrToInt(edtThreads.Text)); while Mylist.Count-1 > 0 do begin for i := 0 to length(MyThreadArray) - 1 do begin MyThreadArray[i] := TMyThreads.Create(true); MyThreadArray[i].FIndex := i; MyThreadArray[i].FValue := Myylist[0]; MyThreadArray[i].Priority := tpIdle; MyThreadArray[i].FreeOnTerminate := True; hndlArray[i] := MyThreadArray[i].Handle; MyThreadArray[i].Resume; Mylist.Delete(0); end; //die ersten threads durchlaufen und warten bis diese beendet sind //um dann die nächsten threads zu initialisieren WaitForMultipleObjects(StrToInt(edtThreads.Text), @hndlArray, True, 60000); end; Myylist.Free; end; |
Re: Prüfen wann alle Threads beendet wurden
ich hab folgendes tutorial genutzt:
![]() dort steht unter anderem: Zitat:
thread gesetzt ist, das wäre dann also erst der fall wenn er abgearbeitet wurde und genau darauf soll ja nun WaitForMultipleObjects warten :gruebel: |
Re: Prüfen wann alle Threads beendet wurden
also das problem, wie ich mir sagen lassen habe, lag am dynamischen
array das an die api funktion übergeben wird, folgender code funktionier nun anscheinend:
Delphi-Quellcode:
procedure TMainForm.LunchThreads;
var i, hndlArraylength: integer; Mylist: TStringlist; hndlArray : Array[0..63] of THandle; begin ... //prüfen ob threads laufen und stringliste laden ... Setlength(ThreadArray, 64)); while Mylist.Count > 1 do begin for i := 0 to length(ThreadArray) - 1 do begin ThreadArray[i] := TMyThreads.Create(true); hndlArray[i] := ThreadArray[i].Handle; ThreadArray[i].FIndex := i; ThreadArray[i].FValue := Mylist[0]; ThreadArray[i].Priority := tpIdle; ThreadArray[i].FreeOnTerminate := True; ThreadArray[i].Resume; if Mylist.Count > 1 then Mylist.Delete(0) else break; end; WaitForMultipleObjects(64, @hndlArray, True, 20000); end; Mylist.Free; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz