![]() |
Thread nach Ablauf wiederverwenden
Hallo Leuts,
ich stehe gerade vo ein _kleinen_ Problem. Ich habe einen Thread, der einen Job bekommt und die Resultate dann per Synchronize abholen lässt. Danach steht er im Terminated-Status. Ich möchte diesen Thread wieder verwenden, allerdings scheint dieser etwas dagegen zu haben. Der erste Aufruf nach der Erzeugung funktioniert mittels Resume problemlos, der Thread macht seinen Job und gut ist. Er geht in den Terminated-Status, wird nicht gefreeed. Sobald die Ergebnisse angekommen sind, kann man den Thread wieder Starten, aber dann kommt die Überraschung: Er reagiert nicht. Er macht nichts, null, bewegt sich keinen mm. Wenn ich mir per F4 die erste Zeile anspringen lasse, so springt er nicht hinein, es scheint so, als ob er den zweiten Aufruf einfach nur ignoriert. Was mache ich falsch? Bitte helft mit, es ist (leider) _sehr_ eilig. mfG Markus |
Re: Thread nach Ablauf wiederverwenden
du hast einfach das Konzept der Threads nicht verstanden. Bei einem Thread wird eine Methode ausgeführt in einem anderen Threadkontext. Wenn diese Methode vorbei ist, ist auch der Thread zu ende. Du darfst also nie aus deiner Methode rauskommen. Wenn du einen Thread mit suspend etc. schlafen lägst wacht dieser auch nicht von alleine auf sondern du musst ihn von außerhalb mit Resume wieder aufwachen lassen. Aber immer unter der Berücksichtigung das der Thread zu Ende ist wenn die ThreadMethode verlassen wird (bei TThread ist das die Execute-Methode)
|
Re: Thread nach Ablauf wiederverwenden
Das mit dem Wiederresumen ist mir auch klar...
Ich denke, der Sinn hängt auch von der Aufgabe ab. Mein Thread erstellt auf Knopfdruck eine Liste von x*100000 Array-Einträgen. Währenddessen kann der Benutzer weiter mit dem Programm arbeiten. Sobald der Thread fertig ist, lädt das Programm dieses Array. Will der Benutzer ein neues Array, klickt er wieder auf den Knopf, und dann soll der Thread wieder Anlaufen. Wieso kann man das nicht machen? Besteht da keine Möglichkeit, den Thread einfach wieder anzuwerfen? Ansonsten kapsle ich das ganze in eine Schleife, aber das würde mir nicht so gefallen. Danke für die Antwort Markus EDIT: Ich bin davon ausgegangen, dass man den Thread, nachdem er Terminated hat, einfach wieder anwerfen kann... EDIT2: Gut, ich habs jetzt gerafft ... einfach eine Schleife mit while not terminated und am ende der schleife ein suspend ... dann wartet er auf das resume und geht dann wieder an den anfang |
Re: Thread nach Ablauf wiederverwenden
Delphi-Quellcode:
procedure TMyThread.Execute;
begin while not Terminated do begin MacheWas; Suspend; // wenn wieder was is einfach den Thread Resumen, dann macht er wieder was. // aber achtung: nach nem .Terminate muss auch ein .Resume her. end; end; |
Re: Thread nach Ablauf wiederverwenden
Genau so hab ichs gelöst, aber DANKE!
|
Re: Thread nach Ablauf wiederverwenden
Ich weiß ja nicht ob ich das mit den Threads generell so verstanden habe, allerdings mache ich das immer wie folgt:
Thread erzeugen (mit oder ohne Start-Parameter) Thread laufen lassen Thread gibt Ergebnis zurück Thread entfernt sich aus Speicher Wenn ich das jetzt nochmal möchte, dann einfach den Thread erzeugen. Es gibt doch keinen Grund den Thread "wiederzubeleben", da die ausgeführten Methoden gekapselt sein müssen. cu Oliver |
Re: Thread nach Ablauf wiederverwenden
Doch, wenn ich:
a) Vermeinden möchte, dass zwei WorkerThreads parallel laufen. b) nicht jedes Mal alle Propertys setzen möchte. c) keine Ahnung mfG Markus |
Re: Thread nach Ablauf wiederverwenden
Zitat:
Aber wozu dann Threads ... es ist doch der Sinn daß sie parallel laufen :gruebel: Zitat:
Zitat:
PS: die Globalen müssen natürlich Threadsicher sein :zwinker: |
Re: Thread nach Ablauf wiederverwenden
Zitat:
|
Re: Thread nach Ablauf wiederverwenden
Zitat:
Zitat:
Aber ich werde niemals ein Programm so verbiegen, dass ich eine Anweisung/Procedure möglichst irgenwie nochmals anspringe (das hat so etwas von goto aus basic), sondern ich rufe diese Anweisung/Procedure einfach auf (und/oder sei es ein Thread den ich starte) ;) Aber ich glaube das bekommt jetzt etwas philosophisches ... Die ursprüngliche Frage ist ja beantwortet. cu Oliver |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 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