![]() |
AW: Abstrakter ThreadPool
Habe eine ungeteste Anpassung für Delphi 2009 eingebaut und ins Repository eingespielt:
![]() Musste die bewährte "Compilers.inc" von Mike Lischke einbinden. Kann das jemand testen und mir mitteilen, ob es sich damit jetzt compilieren lässt? Dank im Voraus! |
AW: Abstrakter ThreadPool
Danke für Deine Änderungen, aber:
ThreadPool lässt sich nun ohne Fehlermeldung kompilieren. Die beiliegenden Demos stürzen jedoch ab, im folgenden die ersten Fehlermeldungen mit dem angezeigten Codeabschnitt:
Code:
->Erste Gelegenheit für Exception bei $76EDFBAE. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00475AF1 in Modul 'PrimePoolProject.exe'. Lesen von Adresse 00000000'. Prozess PrimePoolProject.exe (4432)
function IsTaskValid(Task:TPoolTask):Boolean;
begin Result:=Owner.Tasks.IndexOf(Task) >= 0; end;
Code:
-> Erste Gelegenheit für Exception bei $76EDFBAE. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00475AF1 in Modul 'PrimePoolProject.exe'. Lesen von Adresse 00000000'. Prozess PrimePoolProject.exe (4432)
procedure TPoolManager.WorkerTerminated(TerminatedWorker:TPoolWorker);
begin BeginWriteWorkers; try Workers.Remove(TerminatedWorker); finally EndWriteWorkers; MainSignal.SetEvent; end; end; |
AW: Abstrakter ThreadPool
Zitat:
Fragen über Fragen. Hätte ich mir doch gleich denken können, dass man für keine "Plattform" programmiert, die man selbst nicht hat/testen kann. :cry: |
AW: Abstrakter ThreadPool
Antworten
1. Der Fehler tritt erst auf wenn Add Task geklickt wird, der Fehler tritt erst am beim letzen (?) Durchlauf der Schleife for c:= 0 to Steps - 1 auf 2. Nein, im Memo werden keine Einträge angelegt 3. Die beiliegenden Kompilate der Demos laufen problemlos 4. Der Fehler tritt bei den vom mir kompilierten Demos immer auf. |
AW: Abstrakter ThreadPool
Zitat:
Generics/Closures wurden in D2010 verbessert = beta Generics/Closures wurden in DXE weiter verbessert = stable? So oder so ähnlich wird es wohl sein. Genau da vermute ich den Fehler. Daher werde ich das bisher versuchte wieder droppen und nicht weiter probieren etliche Workarounds einzubauen, um mit D2009 kompatibel zu sein. Der ganze ThreadPool sollte ursprünglich komplett auf Generics basieren, welchen man nur die spezielle Task-Klasse übergibt, doch dort scheiterte ich, weil der Support der Generics noch nicht fehlerfrei ist, damit will ich sagen, dass ich schon mit 2010er meine Probleme hatte. So ist das mit neuen Möglichkeiten, doch irgendwann muss man sie nutzen um einen Nutzen zu erlangen. Nichtsdestotrotz ist es Open Source, also wenn das jemand hinmoddeld, dass es funktioniert, dem ist ein Eintrag unter Credits/Copyrights sicher. |
Neue Version 1.0.1 herausgegeben
Soeben habe ich die neue Version 1.0.1 veröffentlicht. (Links siehe 1. Beitrag)
Neben einigen Optimierungen enthält es jetzt die Unterstützung für priorisierbare Tasks. Ableitende Tasks können die Eigenschaften TPoolTask.Priority oder TPoolTask.PriorityRaw veröffentlichen und der entsprechende Manager muss die Eigenschaft TPoolManager.SortTasks auf TRUE setzen um die Sortierung zu aktivieren. Wenn mehr Aufgaben hinzugefügt werden, als gleichzeitig abgearbeitet werden können, so kommen die Tasks mit der höheren Priorität eher dran. Ach ja, als Voraussetzung bleibt: ab Delphi 2010 :shock: |
AW: Abstrakter ThreadPool
Was vielleicht noch für den einen odere anderen nützlich sein könnte, wären Abhängigkeiten der Aufträge, so dass B erst nach A ausgeführt wird.
Prinzipiell ist die Sache super. Für mich zwar mangeld D2010/XE nicht nutzbar, aber es zeigt, dass die Community zumindest noch nich ganz kapituliert hat ;) |
AW: Abstrakter ThreadPool
Zitat:
Delphi-Quellcode:
var Task:TMyTask; begin Task:=TMyTask.Create(Owner); // Task mit Daten füllen Task.OnDone:=procedure(Sender:TObject) var DependTask:TMyTask; begin if TMyTask(Sender).State <> tsSuccess then Exit; DependTask:=TMyTask.Create(Owner); // DependTask mit Daten füllen TMyPoolManager.AddTask(DependTask); end; TMyPoolManager.AddTask(Task); end; Zitat:
![]() |
AW: Abstrakter ThreadPool
Auf die Idee mit dem Event-Handler war ich auch schon gekommen. Die Abhängigkeit mit in das Interface zu integrieren, würde weniger Glue-Code produzieren und man könnte Workflows fast 1:1 abbilden.
Natürlich wird Native-Code noch lange eine Rolle spielen. Aber IMHO werden es immer weniger Community-Projekte und 3rd-Party-Bibliotheken/Komponenten. Und schließlich waren die ganzen Projekte rund um Delphi lange ein Alleinstellungsmerkmal. |
Neue Version 1.0.3 veröffentlicht
Hallo alle zusammen,
heute habe ich die neue Version 1.0.3 des ThreadPool veröffentlicht (Download-Links wie gehabt im 1. Beitrag). Die ThreadPool-Unit wurde massiv rationalisiert. Es werden jetzt weniger Locks benötigt und die ganze Unit konnte (trotz höherer Versionsnummer) etwas schrumpfen. In der Version 1.0.2, die ich hier nicht vorstellte, gab es eine CodeSite-Integration, die mittels Compiler-Conditionals in der beiliegenden Compile.inc aktiviert werden kann. Es ist doch ziemlich schwierig soetwas mittels Breakpoints/OutputDebugString zu debuggen. Desweiteren kam ein DUnit-Testprojekt hinzu, in dem —unter anderem– diverse Stress-Tests stattfinden, die vor jedem Release bestanden werden müssen. Es ist ebenfalls dem Archiv beigelegt. Ich wünsche allen ein erfolgreiches neues Jahr! P.S.: Ja, ich bin auf Delphi XE umgestiegen und bin sehr glücklich damit :-D. Da ich D2010 parallel betreibe, ist (und hoffentlich bleibt) der ThreadPool weiterhin damit kompatibel. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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