AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte ThreadPool 1.0.9 für Delphi 2010-XE

ThreadPool 1.0.9 für Delphi 2010-XE

Ein Thema von WladiD · begonnen am 14. Dez 2010 · letzter Beitrag vom 20. Okt 2015
Antwort Antwort
Seite 3 von 4     123 4   
WladiD
Registriert seit: 27. Jan 2006
Nachdem ich vergeblich nach einem Open-Source Thread-Pool für Delphi gesucht habe, welches meine Bedürfnisse abdeckt, musste ich mich dafür entschließen, einen eigenen zu schreiben. Diesen möchte ich euch hier vorstellen.

Vereinfacht kann man die Funktionsweise des ThreadPools wie folgt beschreiben:

Man verbindet sich aus einem beliebigen Thread mit dem spezifischen Manager (welcher ebenfalls ein eigenständiger Thread ist) und übergibt ihm eine Aufgabe. Der Manager übergibt die Aufgabe an einen neuen bzw. schlafenden Arbeiter oder packt sie auf die Warteliste, wenn bestimmte Grenzwerte es nicht zulassen die Aufgabe sofort abzuarbeiten. Der Arbeiter nimmt sich der Aufgabe an, arbeitet sie parallel ab und meldet sich über synchronisierte Ereignisse, wenn er fertig ist. Hat der Manager noch weitere Aufgaben anliegen, so bekommt der Arbeiter sofort den Nächsten. Sind alle Aufträge abgearbeitet, so kann der Manager eine bestimmte anzahl an Arbeitern schlafen legen (SpareWorkersCount) und die restlichen Arbeiter werden terminiert.


Hauptmerkmale
  • Manager und Arbeiter sind eigenständige Threads

  • Ein spezifischer Pool wird von den Basis-Klassen TPoolManager, TPoolWorker und TPoolTask abgeleitet, wobei nur wenige Methoden mit "Leben" gefüllt werden müssen.

  • Für jeden abgeleiteten TPoolManager wird (nur) bei Bedarf eine eindeutige Instanz erstellt (verborgenes Singleton pattern)

  • Die genaue Instanz eines spezifischen Managers ist unbekannt und muss über eine Verbindung mittels TMyPoolManager.Connect oder TMyPoolManager.Bind ermittelt werden

  • Der Manager erstellt die Arbeiter gemäß der Auftragslage dynamisch unter berücksichtigung einer definierbaren Obergrenze (TMyPoolManager.ConcurrentWorkersCount)

  • Die Arbeiter-Threads werden wiederverwendet. Das heißt, ist ein Arbeiter fertig und es liegen weitere Aufträge an, so bekommt er sofort den Nächsten.

  • Anzahl an schlafenden Arbeitern kann über TMyPoolManager.SpareWorkersCount definiert werden

  • Aufträge können einen Eigentümer haben

  • Für jeden Eigentümer können Event-Handler an die Ereignisse OnTasksStatus und OnTasksComplete gebunden werden

  • Aufträge können gezielt abgebrochen werden, z.B nach dem Eigentümer (TMyPoolManager.CancelTasksByOwner)

  • Jeder Auftrag verfügt über die Basis-Ereignisse: OnStart, OnCancel, OnDone und kann um beliebige weitere ergänzt werden

  • Aufträge können priorisiert werden

  • Der Manager unterstützt den Demand-Mode: D.h. er beendet sich selbst, wenn keine Aufträge anliegen und keine Arbeiter auf Vorrat gehalten werden müssen.

  • Alle instanzierten Thread-Pools (Manager und Arbeiter) können mit einer einzelnen Anweisung (z.B. bei Programmende) sauber terminiert werden: TPoolManager.TerminateAllRunningPools

  • Die Freigabe eines zuvor registrierten Eigentümer kann an alle Thread-Pools mittels TPoolManager.DispatchOwnerDestroyed übermittelt werden

  • Dynamsiche Anpassung von gleichzeitigen und auf Vorrat zu haltenden Arbeitern an das Ziel-System mittels TMyPoolManager.ConcurrentWorkersCountPerCPU und TMyPoolManager.SpareWorkersCountPerCPU

  • Last but not least: Kein Polling.
    Die Manager und Arbeiter lauschen mittels WaitFor(INFINITE) an ihren Hauptsignalen, dadurch wird kostbare Rechnerkapazität nicht sinnlos vergeudet.


Download

Damit ich das Archiv nicht bei jedem Update hier aktualisieren muss, verlinke ich am liebsten zur Projektseite bei SourceForge:

ThreadPool for Delphi (Download | Git-Repository)

Das Archiv enthält bereits zwei ausführliche Beispiele (auch in kompilierter Form), sodass man sowohl die Implementierung eines spezialisierten Thread-Pools nachvollziehen kann als auch dessen Verwendung.

Voraussetzung

Die Unit ist ab Delphi 2010 lauffähig.

Lizenz

Wie ich in der Einleitung geschrieben hatte, suchte ich nach einer Open-Source Lösung, die es nicht gab. Aus diesem Grunde stelle ich meine unter die MPL 1.1.

mfg

Geändert von WladiD (10. Mai 2011 um 11:41 Uhr) Grund: Neue Version / Geändertes Konzept
 
WladiD

 
Delphi 10.4 Sydney
 
#21
  Alt 7. Apr 2011, 14:40
Ein Hallo an alle DP-Mitglieder,

muss seit gestern wieder den ThreadPool erweitern und habe einige heikle Änderungen durchführen müssen. Soweit sieht es ganz gut aus, die DUnit-Tests laufen problemlos, auf meinem Core-i7 920 und in Virtual-PC (Single-Core), durch. Doch was heisst das schon...ich brauche noch ein paar Tests von anderen Systemen.

Wer ist von Euch so nett und lässt den angehängten (kompilierten) Test auf seinem Rechner laufen?

Wenn ihr die Exe startet, reicht ein Klick auf den grünen Play-Button (oder Enter-Taste), um einen Test-Durchlauf zu starten. Ein kompletter Durchlauf dauert, je nach System, ca. 1-3 Minuten. Jeder bestandene Teil-Test wird grün gekennzeichnet. Wichtig ist, dass es komplett grün durchläuft (wie im angehängten Screenshot).

Schön wäre es auch, wenn Ihr den gesamten Test mehrmals wiederholen könntet. Drückt dazu jeweils auf Enter, wenn es fertig ist.

Natürlich brauche ich dann Feedback (am besten mit Screenshot), wenn es nicht durchläuft oder gar Exceptions geworfen wurden. Aber über ein einfaches "Läuft komplett durch!", würde ich mich auch freuen.

mfg

P.S.: Die aktuellen Codes sind im Git-Repository bei SF abrufbar (falls es jemand selbst kompilieren möchte).
Miniaturansicht angehängter Grafiken
threadpooldunittest.png  
Angehängte Dateien
Dateityp: zip ThreadPoolTest.zip (651,0 KB, 41x aufgerufen)
Waldemar Derr
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

 
Delphi 10.2 Tokyo Professional
 
#22
  Alt 7. Apr 2011, 14:44
Hallo,

"Läuft komplett durch!"

Intel Core 2 Duo, 2,93GHz
2GB RAM
Windows Vista 32-Bit

Gruß
Neutral General
Michael
  Mit Zitat antworten Zitat
WladiD

 
Delphi 10.4 Sydney
 
#23
  Alt 7. Apr 2011, 14:46
Hallo,

"Läuft komplett durch!"

Intel Core 2 Duo, 2,93GHz
2GB RAM
Windows Vista 32-Bit

Gruß
Neutral General
Super, Danke!
Waldemar Derr
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

 
Delphi XE Professional
 
#24
  Alt 7. Apr 2011, 15:11
Hi,

drei mal laufen lassen, keine Probleme
  Mit Zitat antworten Zitat
WladiD

 
Delphi 10.4 Sydney
 
#25
  Alt 7. Apr 2011, 15:41
Hi,

drei mal laufen lassen, keine Probleme
Auch dir ein Dankeschön!

Da ich parallel schon zig Tests durchgeführt habe, sehe ich jetzt einfach mal die Änderungen als "stabil" an.
Waldemar Derr
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

 
Delphi 11 Alexandria
 
#26
  Alt 7. Apr 2011, 15:44
Ich denke, das ist berechtigt, selbst auf meinem "vermurkten" Laptop mit Vista 32 Bit treten keine Fehler auf.
Detlef
  Mit Zitat antworten Zitat
ConstantGardener

 
Delphi 10.4 Sydney
 
#27
  Alt 7. Apr 2011, 18:25
...3 Starts, drei mal ohne Fehler (Win 7 64 Bit, Core X5)
Andreas Schachtner
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

 
Delphi 10.2 Tokyo Professional
 
#28
  Alt 7. Apr 2011, 19:14
Hi,

Weils so viel Spaß gemacht hat, nochmal auf meinem Rechner zuhause, wieder ohne Probleme

Intel Core i5 - 2,66GHz
4GB RAM
Windows 7 Professional 64 Bit
Michael
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#29
  Alt 7. Apr 2011, 19:27
Moin moin,

Core i7-860 2.8 GHz
8 GB RAM
Windows 7 Professional x64

läuft alles 1A durch
David F.
  Mit Zitat antworten Zitat
WladiD

 
Delphi 10.4 Sydney
 
#30
  Alt 7. Apr 2011, 21:05
Ein gebündeltes Dankeschön an alle Tester!

Ihr könnt euch nicht vorstellen, wie sehr mich diese Ergebnisse beruhigen und motivieren. Es ist gar nicht so einfach einen Thread-Pool ohne eine (Windows-)Message-Queue, sondern nur mit Delphi-Bordmitteln umzusetzen. Ich bin nämlich optimistisch in den kommenden Jahren diesen auf Mac und Linux laufen sehen zu können.
Waldemar Derr
  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 08:43 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