AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread nach Ablauf wiederverwenden

Ein Thema von markusj · begonnen am 17. Jun 2006 · letzter Beitrag vom 18. Jun 2006
Antwort Antwort
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#1

Thread nach Ablauf wiederverwenden

  Alt 17. Jun 2006, 22:49
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
Markus
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Thread nach Ablauf wiederverwenden

  Alt 17. Jun 2006, 22:55
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#3

Re: Thread nach Ablauf wiederverwenden

  Alt 17. Jun 2006, 23:07
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
Markus
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Thread nach Ablauf wiederverwenden

  Alt 17. Jun 2006, 23:12
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;
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#5

Re: Thread nach Ablauf wiederverwenden

  Alt 17. Jun 2006, 23:18
Genau so hab ichs gelöst, aber DANKE!
Markus
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

Re: Thread nach Ablauf wiederverwenden

  Alt 17. Jun 2006, 23:32
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#7

Re: Thread nach Ablauf wiederverwenden

  Alt 18. Jun 2006, 07:59
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
Markus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#8

Re: Thread nach Ablauf wiederverwenden

  Alt 18. Jun 2006, 08:23
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

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

Zitat von markusj:
c) keine Ahnung
na ich erst



PS: die Globalen müssen natürlich Threadsicher sein
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Thread nach Ablauf wiederverwenden

  Alt 18. Jun 2006, 09:06
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

Re: Thread nach Ablauf wiederverwenden

  Alt 18. Jun 2006, 20:58
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 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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz