Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Verwalten von Threads (https://www.delphipraxis.net/172255-verwalten-von-threads.html)

HJay 20. Dez 2012 21:37

Verwalten von Threads
 
Ich starte etliche Threads nacheinander, je nachdem, was der Anwender auswählt. Dadurch starten und beenden sich Threads stark überlappend und sind oftmals viele Threads gleichzeitig am laufen. Soweit klappt das auch alles wunderbar.

Ich frage mich jetzt, wie man diese vielen Threads am einfachsten verwaltet, so dass man beim Programmende weiß, auf welche man noch warten muss oder welche man ggf. einfach beenden muss.

Gibt es da eine bewährte Vorgehensweise oder gar vorhandene Methoden, die ich nicht kenne, oder muss ich selbst eine Liste von Threads verwalten und schauen, dass ich auf sie aufpasse?

schlagzu 21. Dez 2012 00:49

AW: Verwalten von Threads
 
Liste selbst anlegen einfach TList oder dyn. Array.

beim beenden (onterminate) einfach den Thread freigeben und aus der Liste nehmen.

MfG Schlagzu

Sir Rufo 21. Dez 2012 06:25

AW: Verwalten von Threads
 
IMHO wäre es angebrachter keine Threads zu starten, sondern Tasks zu starten, die von einem ThreadPool abgearbeitet werden.

Drehscheibe ist dabei der ThreadPoolManager, der bekommt die Tasks und verteilt diese auf die freien Threads im Pool.

Wird der Manager freigegeben, dann kümmert der sich auch um die Freigabe der Tasks und Threads.

HJay 21. Dez 2012 09:41

AW: Verwalten von Threads
 
ThreadPool: Interessanter Ansatz. Gibt es denn dafür fertige Lösungen? In D2010 konnte ich nichts dazu finden...

TiGü 21. Dez 2012 09:47

AW: Verwalten von Threads
 
Zitat:

Zitat von HJay (Beitrag 1196373)
ThreadPool: Interessanter Ansatz. Gibt es denn dafür fertige Lösungen? In D2010 konnte ich nichts dazu finden...

http://delphi.about.com/od/kbthread/...ry-example.htm

Schau mal hier rein!
Es wird die die Omni Thread Library (OTL) verwendet.

HJay 21. Dez 2012 10:22

AW: Verwalten von Threads
 
@TiGü: Danke. sieht professionell und bewährt aus.

Ich würde aber eigentlich doch gerne selbst eine Minimal-Version implementieren und nicht noch mehr externe Libraries verwenden. Schließlich möchte ich aja uch verstehen, wie es funktioniert, wenn ich mich schon in Threads einarbeite.

Derzeit verwende ich für jede Gruppe von neuen Tasks einen neuen "StarterThread", der dann die entsprechenden Tasks startet. Immerhin klappt das und st zu 100% selbst geschrieben (und verstanden :-).

Besser wäre es natürlich, statt der immer neuen StarterThreads nur einen einzigen dauerhaften PoolThread zu haben, dem man die neuen Aufgaben dann übergibt und er startet neue Threads wie benötigt, aber maximal eine bestimmte Anzahl.

FRAGEN:

(1) Mit Synchronize() kann ich von einem Thread aus eine Aufgabe im VCL-Thread ausführen lassen und somit auf alle Daten lesend und schreiben zugreifen.

Was muss ich im umgekehrten Falle tun?

Angenommen ich habe eine selbst definierte Liste TaskObjectList, der ich ein neues Objekt zufügen möchte. Wie bekomme ich folgende theoretische Anweisung threadsicher umgeschrieben?

Code:
procedure TForm.Button1Click(Sender:Tobject);
begin
  MyThreadPool.TaskObjectList.Add(MyNewTask);
end;
FRAGE 2: Der PoolThread wartet mit einer Endlosschleife auf Aufgaben:

Code:
while not Terminated do begin
 // falls ein Thread frei ist und eine Aufgabe wartet,
 // arbeite die nächste Aufgabe ab
  Sleep(100)
end;
Gibt es eine elegantere Möglichkeit, so dass der PoolThread nicht mit der Endlosschleife Kraft verplempert. sondern von der VCL-Routine geweckt wird?

Ich bin mir noch nicht sicher, welche Routinen und Events in welchem Thread ausgeführt werden, wenn sie von dem VCL-Thread aufgerufen werden?

HJay 21. Dez 2012 16:05

AW: Verwalten von Threads
 
Danke, hat sich erledigt. Mein TThreadPool leistet, was er soll und das auf recht kurze und übersichtliche Art.

Letztlich habe ich es mit Messages gut gelöst bekommen.

Zacherl 21. Dez 2012 16:08

AW: Verwalten von Threads
 
Synchronization kannst du unter Windows recht gut mit CreateEvent(), SetEvent(), ResetEvent() und WaitForSingleObject() realisieren. Dann sparst du dir so Sachen wie Sleep().

HJay 27. Dez 2012 11:34

AW: Verwalten von Threads
 
@Zacherl: Danke! Ich habe es jetzt mit WaitMessage() gelöst, aber Dein Vorschlag ist auch sehr gut!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 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