Hi Leute,
ich habe eine Service Anwendung, die mehrere Aufgaben erledigt.
Zum einen sitzt dort ein
Tcp-Server(
Indy) drauf und antwortet auf Anfragen.
Zum anderen habe ich 4-6 Threads die im Hintergrund einige arbeiten erledigen(nicht diesselben!).
- Einer macht z.B. Backup von Files
- Ein anderer sendet "Pings" an einen Server im Web
- Einer führt etwas längere Berechnung anhand
DB-Daten durch
- Einer importiert eine bestimmte Datei(falls vorhanden) in eine
DB
....
Da das ganze bei mir seit langerem immer gewachsen ist und immer nur schnell eben erweitert werden mußte,
möchte ich das ganze jetzt etwas eleganter/effizienter lösen, denn im Moment verwende ich
Einen Timer der alle 10 Sekunden prüft, welche Threads gestartet werden müssen und startet diese gegebenfalls.
Mein OnExecute des Service sieht so aus:
Delphi-Quellcode:
While not Terminated do begin
ServiceThread.ProcessRequests(True);
end;
Mein Ziel ist es den Timer verschwinden zu lassen und eine Art Kontrollinstanz einzuführen,
die jederzeit weiß welche Threads laufen und in was für einem Zustand sich diese befinden.
Die Kontrollinstanz sollte Threads bei Bedarf starten/erzeugen und
ebenso sollte die Kontrollinstanz die Möglichkeit haben die Threads vorzeitig sauber zu beenden.
Eine rudimentäre Kommunikation zwischen denn Threads wäre auch nicht schlecht(über Events ?!)
Mein erster war mit einem Master-Thread zu arbeiten, der nichts tut außer die Threads in einer Liste zu verwalten und zu überwachen.
Hinzu kommt eine "Child-Work-Thread" Klasse, von der alle Threads abgeleitet werden, die nachher vom Master verwaltet werden sollen.
In dieser Klasse wird das zusammenspiel zwischen Master und Child Threads implementiert.
Die späteren Thread-lassen erben das von "Child-Work-Thread" und definieren die Methode die DoWork in "Child-Work-Thread" virtual definiert ist.
^^ Soweit ^^ mein Gedankenansatz, was haltet Ihr davon ? Was kann man besser machen ? Was ist unsinnig ?
Bin auch für ganz andere Lösungsansätze offen
Interessant ist vielleicht noch das mein Dienst 3 verschiedene Datenbank Verbindungen hat,
könnte es bei den ganzen Child Threads zu Problemen führen ?
Die Verbindungen werden im OnStart/OnContinue des Dienstes hergestellt.
Bin gespannt auf eure Antworten,
Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.