![]() |
Workerthreadpool Frage
Hi Leute
Ich habe mir die Unit csWorkerThreadPool.pas angeschaut. ![]() 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. |
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:
eine Nachricht schicken, wo er seine Fertigstellung meldet.
TThread.Synchronize
|
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:
|
AW: Workerthreadpool Frage
"A
Zitat:
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 12: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-2025 by Thomas Breitkreuz