AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WorkerThread erweitern

Ein Thema von SvB · begonnen am 26. Okt 2010 · letzter Beitrag vom 27. Okt 2010
 
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

WorkerThread erweitern

  Alt 26. Okt 2010, 22:02
Hi, ich arbeite mit dem WorkerThread und es funktioniert alles wunderbar. Nun habe ich folgende Besonderheit, die ich implementieren möchte und wollte erst hier mal anfragen, ob meine Überlegungen funktionieren könnten, bevor ich rum bastele. Ich habe mir jetzt einige Zeit die Unit genau angesehen und ich denke, dass ich es einigermaßen verstanden habe, was da passiert.

Ich habe einen WorkerThreadPool mit einer PoolSize von 5, d.h. es werden 5 Threads erzeugt, die "gleichzeitig" 5 Jobs abarbeiten können (habe ich verstanden). Nun benötige ich aber, dass ein bestimmter Typ von Job nur einmal "gleichzeitig" abgearbeitet werden kann und die anderen Jobs gleichen Typs solange in der Warteschlange bleiben, bis der aktuelle Job abgearbeitet worden ist. Hier meine Überlegung:

Variante 1:
Ich erweitere TWorkerThreadJob um eine Feld fMaxSimultaneous und setze das beim Erzeugen meins speziellen Jobs auf 1, der Standardwert ist 0 und dann läuft alles wie gehabt.
Dann erzeuge ich mir eine Klasse "TWorkerThreadJobListWorking", in der die Jobs drinne stehen, die gerade abgearbeitet werden. Dadurch, dass in "WaitForNextJob" der Job aus der Liste gelöscht wird, der als nächstes abgearbeitet werden soll, füge ich diesen Job in "TWorkerThread.Execute" in "TWorkerThreadJobListWorking" hinten ran. Bevor ich den hinten ran hänge, prüfe ich, ob ein Job selben Typs da schon drin ist, wenn nein, dann füge ich ihn hinzu, wenn ja, dann füge ich den Job wieder ans Ende der "normalen" Job List. Wenn "Run" abgearbeitet wurde, dann nehme ich den Job aus "TWorkerThreadJobListWorking" wieder raus. Der Nachteil hierbei wäre, dass ein Job, der in der Liste oben steht, dann auf einmal wieder ganz unten steht.

Variante 2:
Ich erweitere TWorkerThreadJob um eine Feld fMaxSimultaneous und setze das beim Erzeugen meins speziellen Jobs auf 1, der Standardwert ist 0 und dann läuft alles wie gehabt. Dann noch ein Feld fWorking: Boolean.
In WaitForNextJob wird der "neue" Job nicht mehr aus der Liste gelöscht. Ich durchlaufe per Schleife die Liste und prüfe, welcher der nächste Job ist der fWorking = False hat. Dann prüfe ich, ob dieser Job fMaxSimultaneous = 1 hat und prüfe dann noch mal die Liste ob schon ein Job selben Typs fWorking = True hat. Wenn das nicht der Fall ist, dann wird fWorking auf True gesetzt und der Job zurück gegeben. Wenn ich "TWorkerThread.Execute" das "Run" abgearbeitet wurde, dann wird der Job aus der Liste entfernt.

Was denkt Ihr, was der bessere Ansatz wäre? Oder habt Ihr eventuell noch eine andere Idee?

Danke
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  Mit Zitat antworten Zitat
 


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 13:30 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