Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Workerthreadpool Frage (https://www.delphipraxis.net/183967-workerthreadpool-frage.html)

IMPEGA 16. Feb 2015 17:31

Workerthreadpool Frage
 
Hi Leute
Ich habe mir die Unit csWorkerThreadPool.pas angeschaut.
http://www.delphipraxis.net/93835-wo...ntergrund.html
Sehr angenehme Sache. So weit läuft Alles super. Ich hätte aber noch eine Kleine Frage zu dem Thema.

Wie frage oder fange ich es ab wenn Alle Threads (Job's) fertig sind?
Ich habe es über Umwege abgefangen. Sprich meine Liste gezählt und wenn die Endzahl erreicht ist eben als fertig gemeldet.
Das ist aber nicht gerade eine schöne Methode.
Kann man die Threads die man abgefeuert hat überwachen?
Ich möchte eben zB. 30 Jobs erledigen. Das ganze mit 5 Threads.
Sobald mein letzte Thread fertig ist möchte ich eine Meldung erhalten. Ist es möglich? Falls ja, bitte um Aufklärung.

Für ein paar Tipps bin ich sehr dankbar.

Sir Rufo 16. Feb 2015 18:43

AW: Workerthreadpool Frage
 
Erweitere doch die Klasse um einen Event, der gefeuert wird wenn die Jobwarteschlange leer ist und alle Workerthreads auf Jobs warten. Dann ist der Pool ja im Idle Modus und so würde ich den Event auch nennen
Delphi-Quellcode:
OnIdle
.

Ansonsten lass doch jeden Job zum Schluss per
Delphi-Quellcode:
TThread.Synchronize
eine Nachricht schicken, wo er seine Fertigstellung meldet.

IMPEGA 16. Feb 2015 20:46

AW: Workerthreadpool Frage
 
Dein Vorschlag mit dem Event kriege ich noch nicht hin.
Ich habe zwar schon einige Male mit Threads gearbeitet, bin aber wie zuvor immer noch nur ein Hobbyprogrammierer.
Deinen zweiten Vorschlag werde ich aber wohl umsetzen.
Ansonsten lass doch jeden Job zum Schluss per TThread.Synchronize eine Nachricht schicken, wo er seine Fertigstellung meldet.
Das sollte wohl für mich realisierbar sein.
Bevor ich mich damit noch tiefer beschäftige will ich erst schauen ob es die Hilfe für mich ist die ich benötige.
Ich habe mir schon eine eigene Methode geschrieben gehabt, leider stürzt meine exe immer wieder ab.
Danke für den Ansatz. Damit kann ich was anfangen.

Voreilige Zusatzfrage.
Zitat:

TThread.Synchronize eine Nachricht schicken, wo er seine Fertigstellung meldet.
Ich denke mal ich muss auch überwachen ob der Thread nicht gleich erneut gestartet wurde. Zumindest so lange bis Alle meine Jobs erledigt sind.

Dejan Vu 16. Feb 2015 21:26

AW: Workerthreadpool Frage
 
"A
Zitat:

Zitat von IMPEGA (Beitrag 1290090)
Wie frage oder fange ich es ab wenn Alle Threads (Job's) fertig sind?
Ich habe es über Umwege abgefangen. Sprich meine Liste gezählt und wenn die Endzahl erreicht ist eben als fertig gemeldet.
Das ist aber nicht gerade eine schöne Methode.

Doch, eigentlich schon.

Aus Sicht des Threadpools gilt: Nach dem Job ist vor dem Job, oder einfacher ausgedrückt: Es gibt für ihn kein 'alles erledigt'. Wenn Du 30 Jobs zu erledigen hast, aber erst 10 in die Queue packst und später nochmal 10, dann ist der Pool zwischendurch mal 'fertig' bzw. ist die Queue leer, aber das heißt eben nicht, das nicht vielleicht doch noch etwas kommt.

Dein Ansatz ist also vollkommen richtig, denn nur der Aufrufer weiß, wann alle Jobs abgearbeitet sind.

Du kannst z.B. eine Variable XYZ auf 30 setzen und jeder Job dekrementiert diese Variable in seinem Destruktor mit 'InterlockedDecrement' (=Threadsicher). Wenn die bei 0 ist, bist Du fertig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:35 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