@TiGü: Danke. sieht professionell und bewährt aus.
Ich würde aber eigentlich doch gerne selbst eine Minimal-Version implementieren und nicht noch mehr externe Libraries verwenden. Schließlich möchte ich aja uch verstehen, wie es funktioniert, wenn ich mich schon in Threads einarbeite.
Derzeit verwende ich für jede Gruppe von neuen Tasks einen neuen "StarterThread", der dann die entsprechenden Tasks startet. Immerhin klappt das und st zu 100% selbst geschrieben (und verstanden
.
Besser wäre es natürlich, statt der immer neuen StarterThreads nur einen einzigen dauerhaften PoolThread zu haben, dem man die neuen Aufgaben dann übergibt und er startet neue Threads wie benötigt, aber maximal eine bestimmte Anzahl.
FRAGEN:
(1) Mit Synchronize() kann ich von einem Thread aus eine Aufgabe im
VCL-Thread ausführen lassen und somit auf alle Daten lesend und schreiben zugreifen.
Was muss ich im umgekehrten Falle tun?
Angenommen ich habe eine selbst definierte Liste TaskObjectList, der ich ein neues Objekt zufügen möchte. Wie bekomme ich folgende theoretische Anweisung threadsicher umgeschrieben?
Code:
procedure TForm.Button1Click(Sender:Tobject);
begin
MyThreadPool.TaskObjectList.Add(MyNewTask);
end;
FRAGE 2: Der PoolThread wartet mit einer Endlosschleife auf Aufgaben:
Code:
while not Terminated do begin
// falls ein Thread frei ist und eine Aufgabe wartet,
// arbeite die nächste Aufgabe ab
Sleep(100)
end;
Gibt es eine elegantere Möglichkeit, so dass der PoolThread nicht mit der Endlosschleife Kraft verplempert. sondern von der
VCL-Routine geweckt wird?
Ich bin mir noch nicht sicher, welche Routinen und Events in welchem Thread ausgeführt werden, wenn sie von dem
VCL-Thread aufgerufen werden?