Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Thread nach Ablauf wiederverwenden (https://www.delphipraxis.net/71596-thread-nach-ablauf-wiederverwenden.html)

markusj 17. Jun 2006 23:49


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

SirThornberry 17. Jun 2006 23:55

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)

markusj 18. Jun 2006 00:07

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

Dax 18. Jun 2006 00:12

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;

markusj 18. Jun 2006 00:18

Re: Thread nach Ablauf wiederverwenden
 
Genau so hab ichs gelöst, aber DANKE!

Sir Rufo 18. Jun 2006 00:32

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

markusj 18. Jun 2006 08:59

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

himitsu 18. Jun 2006 09:23

Re: Thread nach Ablauf wiederverwenden
 
Zitat:

Zitat von markusj
a) Vermeinden möchte, dass zwei WorkerThreads parallel laufen.

'ne globaleariable, wo sich jeder WorkerThread anmeldet und andere WorkerThread beim Start solange warten, wie ein andere läuft (welcher dort angemeldet ist)

Aber wozu dann Threads ... es ist doch der Sinn daß sie parallel laufen :gruebel:

Zitat:

Zitat von markusj
b) nicht jedes Mal alle Propertys setzen möchte.

globale Variablen :?:

Zitat:

Zitat von markusj
c) keine Ahnung

na ich erst



PS: die Globalen müssen natürlich Threadsicher sein :zwinker:

SirThornberry 18. Jun 2006 10:06

Re: Thread nach Ablauf wiederverwenden
 
Zitat:

Zitat von Sir Rufo
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

Die Gegenfrage wäre warum man das Threadobject immer wieder neu ezeugen lassen soll wenn es auch anders geht. (und dieser Thread läuft ja assyncron zum Hauptthread). Du benutzt doch sicher auch lieber eine For-Schleife anstelle die Anweisung 500 mal im Quelltext zu tippen.

Sir Rufo 18. Jun 2006 21:58

Re: Thread nach Ablauf wiederverwenden
 
Zitat:

Zitat von SirThornberry
Die Gegenfrage wäre warum man das Threadobject immer wieder neu ezeugen lassen soll wenn es auch anders geht. (und dieser Thread läuft ja assyncron zum Hauptthread).

Wenn das schöner gehen würde wäre es ja toll ;)
Zitat:

Zitat von SirThornberry
Du benutzt doch sicher auch lieber eine For-Schleife anstelle die Anweisung 500 mal im Quelltext zu tippen.

Definitiv, und wenn es mehrere Anweisungen im Block sind, dann packe ich das in eine Procedure (kann man ja immer wieder aufrufen), und wenn die Anweisung im Hintergrund laufen soll, dann packe ich diese sogar in einen Thread ;)
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