![]() |
ThreadPool 1.0.9 für Delphi 2010-XE
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
Download Damit ich das Archiv nicht bei jedem Update hier aktualisieren muss, verlinke ich am liebsten zur Projektseite bei SourceForge: ![]() ![]() ![]() 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 |
AW: Abstrakter ThreadPool
Ich habe mal versucht deine Beispiele zu kompilieren. Leider lässt sich ThreadPool unter meinem Delphi 2009 (alle aktuellen Updates eingespielt) nicht kompilieren.
Hier die Fehlermeldungen:
Code:
[DCC Fehler] ThreadPool.pas(183): E2123 PROCEDURE, FUNCTION, PROPERTY oder VAR erwartet
[DCC Fehler] ThreadPool.pas(184): E2169 Felddefinition nicht erlaubt nach Methoden oder Eigenschaften [DCC Warnung] ThreadPool.pas(184): W1010 Methode 'Destroy' verbirgt virtuelle Methode vom Basistyp 'TThread' [DCC Fehler] ThreadPool.pas(188): E2254 Die überladene Prozedur 'Create' muss mit der Direktive 'overload' gekennzeichnet sein [DCC Fehler] ThreadPool.pas(189): E2254 Die überladene Prozedur 'Destroy' muss mit der Direktive 'overload' gekennzeichnet sein [DCC Fehler] ThreadPool.pas(191): E2252 Es gibt bereits eine Methode 'Destroy' mit identischen Parametern [DCC Fehler] ThreadPool.pas(390): E2123 PROCEDURE, FUNCTION, PROPERTY oder VAR erwartet [DCC Warnung] ThreadPool.pas(390): W1010 Methode 'Destroy' verbirgt virtuelle Methode vom Basistyp 'TPoolThread' [DCC Fehler] ThreadPool.pas(481): E2254 Die überladene Prozedur 'Destroy' muss mit der Direktive 'overload' gekennzeichnet sein [DCC Fehler] ThreadPool.pas(483): E2252 Es gibt bereits eine Methode 'Destroy' mit identischen Parametern [DCC Fehler] ThreadPool.pas(563): E2357 PROCEDURE, FUNCTION oder CONSTRUCTOR erwartet [DCC Fehler] ThreadPool.pas(568): E2357 PROCEDURE, FUNCTION oder CONSTRUCTOR erwartet [DCC Fehler] ThreadPool.pas(574): E2004 Bezeichner redefiniert: 'TPoolThread.Create' [DCC Fehler] ThreadPool.pas(581): E2004 Bezeichner redefiniert: 'TPoolThread.Destroy' [DCC Fehler] ThreadPool.pas(931): E2357 PROCEDURE, FUNCTION oder CONSTRUCTOR erwartet [DCC Fehler] ThreadPool.pas(971): E2004 Bezeichner redefiniert: 'TPoolManager.Destroy' [DCC Fehler] ThreadPool.pas(972): E2004 Bezeichner redefiniert: 'cc' [DCC Fehler] ThreadPool.pas(183): E2065 Ungenügende Forward- oder External-Deklaration: 'TPoolThread.Create' [DCC Fehler] ThreadPool.pas(184): E2065 Ungenügende Forward- oder External-Deklaration: 'TPoolThread.Destroy' [DCC Fehler] ThreadPool.pas(390): E2065 Ungenügende Forward- oder External-Deklaration: 'TPoolManager.Destroy' [DCC Fataler Fehler] PrimePoolForm.pas(6): F2063 Verwendete Unit '..\..\ThreadPool.pas' kann nicht compiliert werden |
AW: Abstrakter ThreadPool
Zitat:
Delphi-Quellcode:
Oder die Unterstützung der Generics (benutze massiv Generics.Collections.TObjectList) ist noch schlechter als in 2010.TPoolThread = class(TThread) type // verschachtelte Typen deklaration TLockList = TObjectList<TMultiReadExclusiveWriteSynchronizer>; TCriticalSectionList = TObjectList<TCriticalSection>; private public ... end; Ich persönlich bin von 2007 gleich auf 2010 gesprungen und habe nie 2009 verwendet, aber dass es Closures (anonyme Methoden) beherrscht wusste ich. Tja, dann muss ich die Anforderungen vorerst einfach mal hochschrauben. Danke für das Feedback. |
AW: Abstrakter ThreadPool
Zitat:
|
AW: Abstrakter ThreadPool
Dann müsste man aber auch auf die anonymen Methoden verzichten, von daher habe ich persönlich wenig Hoffnung :(
|
AW: Abstrakter ThreadPool
Zitat:
Wer einmal die Vorteile von Closures erkannt hat, kann nicht mehr ohne... Sorry. |
AW: Abstrakter ThreadPool
Wenn ich das richtig sehe, scheitert Delphi2009 am
Delphi-Quellcode:
bzw.
class constructor Create;
Delphi-Quellcode:
(die wohl für das Singleton-Pattern vorhanden sind?)
class destructor Destroy;
Ich habe mal testweise die Klassen-Konstruktoren und -Destruktoren auskommentiert, und sobald die vollständig gestrichen wurden, kompilierte Delphi2009 die Unit problemlos durch. Meine Erfahrungen sagen auch, dass verschachtelte Typen (in D2009) kein Problem sein sollten, da ich die schon selbst mal verwendet hatte ;) Ansonsten hört sich der ThreadPool schonmal sehr interessant an, wäre schön, wenn ich die nutzen könnte :) |
AW: Abstrakter ThreadPool
Zitat:
Ansonsten könnte man eine Compiler-Weiche einbauen und sich bei D2009 des initialization/finalization-Abschnitts bedienen. |
AW: Abstrakter ThreadPool
Laut Google sollen die Klassen-Konstruktoren erst ab Delphi2010 unterstützt werden ;)
(Aus der Fehlermeldung Zitat:
Delphi-Quellcode:
bzw.
constructor
Delphi-Quellcode:
nach einem
destructor
Delphi-Quellcode:
erwartet. Habe trotzdem mal die verschiedenen Sichtbarkeiten durchprobiert: Wie zu erwarten ohne Erfolg ;) )
class
|
AW: Abstrakter ThreadPool
Zitat:
danke für die Information (war zu faul zum googeln :wink:), werde demnächst (bin grad an was anderem dran) die erwähnte Compiler-Weiche einbauen und mich hier wieder melden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz