![]() |
Mehrere Threads gleichzeitig...
hi,
ich möchte mehrere Threads eines Typs gleichzeitig ausführen. dazu habe ich mir überlegt: ich schreibe mir ganz normal meinen Thread als ableitung von TThread dann mache ich mir nen array davon und erstelle in ner schleife alle und führe sie aus. das ganze sieht dann so aus:
Delphi-Quellcode:
interessanterweise wird aber nur ein Thread erstellt und ausgeführt...(Cnt ist natürlich >1 ;) )
Thr: array [1..Cnt] of TMyThread;
procedure TForm1.Button1Click(Sender: TObject); var i:Integer; begin for i:=1 to Cnt do begin Thr[i]:=TMyThread.Create(True); //Noch paar Property setzen Thr[i].Execute; ShowMessage('Thread '+IntToStr(i)+' Executed'); end; end; Anhaltspunkte: - ShowMessage erscheint nicht - Ausgabe (via Synchronize) kommt nur vom ersten Thread - Access Violation beim freigeben ab dem zweiten Thread... warum macht der nicht einfach in der schleife weiter? |
Re: Mehrere Threads gleichzeitig...
Wenn du als Parameter bei create True übergibst, musst du die Threads per Name.Resume; wieder starten. :)
|
Re: Mehrere Threads gleichzeitig...
Zitat:
|
Re: Mehrere Threads gleichzeitig...
Natürlich. :)
Allerdings rennen die Thread dann sofort los. Wenn du erst noch Werte innerhalb deiner TMyThread-Instanz setzen willst/musst, musst du das im Konstruktor machen, oder bei dem True bleiben und dann mit .Resume; (kein Execute mehr) den Thread wieder starten. |
Re: Mehrere Threads gleichzeitig...
Statt
Delphi-Quellcode:
musst Du
Thr[i].Execute;
Delphi-Quellcode:
schreiben, da sonst keine Properties mehr gesetzt werden können (bzw. es mach dann keinen Sinn)
Thr[i].Resume;
Thomas |
Re: Mehrere Threads gleichzeitig...
ok, also das geht jetzt...
aber direkt das nächste problem :) wie mach ich die wieder aus?
Delphi-Quellcode:
er bleibt nun beim Thr[i].Free einfach hängen...
var i:Integer;
begin for i:=1 to Cnt do begin Thr[i].Suspend; Thr[i].Free; end; end; und die Threads laufen weiter :( |
Re: Mehrere Threads gleichzeitig...
Delphi-Quellcode:
Um auf die Beendigung zu warten kannst Du das Ereignis OnTerminate auswerten.
var i:Integer;
begin for i:=1 to Cnt do begin Thr[i].Terminate; Thr[i].Priority=tpHigher; Sleep(0); Thr[i]:=nil; end; end; Thomas |
Re: Mehrere Threads gleichzeitig...
Zitat:
aber sie tut es nicht. ich hab so das gefühl das OnTerminate kommt nicht an :( |
Re: Mehrere Threads gleichzeitig...
Das Suspend ist falsch. Bamit haelst du den Thread ja an und er kann sich garnicht beenden.
|
Re: Mehrere Threads gleichzeitig...
Oder du stellst FreeOnTerminate auf True und dann zum ausmachen einfach Thread.Terminate;
(im thread natürlich ein while not Terminated do ... ;) ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 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