AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte ThreadPool 1.0.9 für Delphi 2010-XE
Thema durchsuchen
Ansicht
Themen-Optionen

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 4 von 4   « Erste     234   
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
 
Hunni

 
Delphi 11 Alexandria
 
#31
  Alt 7. Apr 2011, 22:06
Hallo,

auch auf meinem Hightech Rechner (Pentium 4 3GHz HT ) mit Windows 7pro lief der Test ohne Probleme durch.
Hat halt nur etwas gedauert


Torsten
  Mit Zitat antworten Zitat
WladiD

 
Delphi 10.4 Sydney
 
#32
  Alt 10. Mai 2011, 11:54
Heute habe ich die neue Version 1.0.9 veröffentlicht.

Was ich hier ehemals Vorstellte, hat sich (mal wieder) grundlegend geändert, aus diesem Grund habe ich den 1. Beitrag komplett überarbeitet (siehe oben).

Diese Unit wird übrigens produktiv in Lauge eingesetzt.

Dort werden 2 spezielle Thread-Pools verwendet. Einer für sämtliche HTTP-Anfragen und ein Bild-Skalierungs-Thread-Pool
Waldemar Derr
  Mit Zitat antworten Zitat
freimatz

 
Delphi 11 Alexandria
 
#33
  Alt 6. Mai 2013, 15:38
Gibt es etwas Neues? Läuft das auch unter XE2, XE3 oder XE4?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

 
Delphi 10.4 Sydney
 
#34
  Alt 6. Mai 2013, 15:46
Gibt es etwas Neues? Läuft das auch unter XE2, XE3 oder XE4?
Wenn du es anpasst sicherlich: http://sourceforge.net/u/wladid/thre...i/master/tree/
Ich denke mit Anpassung der Compilers.inc sollte es vermutlich in XE2...X4 funktionieren.
  Mit Zitat antworten Zitat
freimatz

 
Delphi 11 Alexandria
 
#35
  Alt 7. Mai 2013, 12:22
Also es gibt nichts Neues. Hintergrund der Frage ist, dass bei uns eine Evaluierung zum Einsatz eines Threadpools stattfindet. Eine Bibliothek, die laufend gepfegt wird, hat da Pluspunkte.
  Mit Zitat antworten Zitat
WladiD

 
Delphi 10.4 Sydney
 
#36
  Alt 7. Mai 2013, 13:47
Ich weiß nicht mehr wieviele Male ich mir fest vorgenommen habe mich wieder da ran zu setzen... Auch AnyiQuack und Lauge will ich irgendwann mal wieder auf Vordermann bringen. Und die Projektseiten müssten auch mal gepflegt werden.

Nach der Arbeit hab ich einfach keine Zeit/Lust mehr oder ich werde einfach zu alt.
Waldemar Derr
  Mit Zitat antworten Zitat
Delphi-Laie

 
Delphi 10.1 Berlin Starter
 
#37
  Alt 20. Okt 2015, 15:09
Ich weiß nicht mehr wieviele Male ich mir fest vorgenommen habe mich wieder da ran zu setzen...
Was schwebt(e?) Dir denn vor, Waldemar? Ist der Threadpool mit immerhin der Version 1.09 nicht ausgereift, oder gibt es noch grundsätzliche fehlende Essentialien, die Dir zu ergänzen vorschweben? Oder geht es doch nur um Hinzufügung der vordefinierte Symbole für RAD-Studio XEx?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


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 15:52 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