AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Verwalten von Threads

Ein Thema von HJay · begonnen am 20. Dez 2012 · letzter Beitrag vom 27. Dez 2012
Antwort Antwort
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#1

Verwalten von Threads

  Alt 20. Dez 2012, 22:37
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?
  Mit Zitat antworten Zitat
schlagzu

Registriert seit: 11. Okt 2010
86 Beiträge
 
Delphi XE Starter
 
#2

AW: Verwalten von Threads

  Alt 21. Dez 2012, 01:49
Liste selbst anlegen einfach TList oder dyn. Array.

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

MfG Schlagzu
  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
 
#3

AW: Verwalten von Threads

  Alt 21. Dez 2012, 07:25
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.
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
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#4

AW: Verwalten von Threads

  Alt 21. Dez 2012, 10:41
ThreadPool: Interessanter Ansatz. Gibt es denn dafür fertige Lösungen? In D2010 konnte ich nichts dazu finden...
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Verwalten von Threads

  Alt 21. Dez 2012, 10:47
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.
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#6

AW: Verwalten von Threads

  Alt 21. Dez 2012, 11:22
@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?
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#7

AW: Verwalten von Threads

  Alt 21. Dez 2012, 17:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Verwalten von Threads

  Alt 21. Dez 2012, 17:08
Synchronization kannst du unter Windows recht gut mit CreateEvent(), SetEvent(), ResetEvent() und WaitForSingleObject() realisieren. Dann sparst du dir so Sachen wie Sleep().
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#9

AW: Verwalten von Threads

  Alt 27. Dez 2012, 12:34
@Zacherl: Danke! Ich habe es jetzt mit WaitMessage() gelöst, aber Dein Vorschlag ist auch sehr gut!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:27 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