Zitat von
DelphiManiac:
Meine Frage nun, ich habe in meiner spezifischen Implementation von
doJob
eine Funktion, die die Einzelnen Messwerte holt und die
VCL aktualisiert (Labels...usw) eine Art Observer Pattern.
Wie kann ich denn diesen Zugriff auf die
VCL synchronisieren, ich will ja nicht den kompletten Job Synchronisieren,...
dann bräuchte ich ja den Thread nicht
.
Na am einfachsten, in dem du die Aktualisierung der
VCL in eine Extra Methode auslagerst. Du hast ja in jedem Job eine bestimmte Anzahl von neuen Messwerten, die du gerne eintragen/anzeigen würdest. Machst du das alles in einem Rutsch, ist die Synchronisation pro
VCL-Element wahrscheinlich günstiger, als wenn du hier nach jedem einzelnen Punkt synchronisierst.
Also einfach den Job ausführen, dir merken welche Werte dabei verändert wurden und dann in einer Methode xyz (die dann auch in der abstrakten Klasse verfügbar ist) die
VCL Komponenten aktualisieren.
Delphi-Quellcode:
procedure TJobListThread.Execute;
var
einJob: TBaseJob;
begin
{ Thread-Code hier einfügen }
while NOT (Terminated) do
begin
If NOT (JobListe.isempty) then
begin
JobListe.getNextJob(einJob);
einJob.doJob;
Jobliste.deleteJob(einJob);
synchronize(einJob.xyz);
// Synchronize(einJob.doJob);
Sleep(100);
end;
end;
end;
Ok, am Namen xyz kann man noch arbeiten
, aber die Idee ist denke ich klar. Du könntest hier z.B. auch einen Datensatz zurückgeben, der alle Messwerte enthält und die
GUI kümmert sich selbst um die aktualisierung.
Was deine Messungen angeht, so hätte ich hier mal noch eine Frage, ob du hier wirklich immer alle 100 ms etwas machst? An sich denke ich wäre es schöner, wenn die Jobliste alle Jobs (wenn mal welche in der Liste sind) so schnell wie möglich abarbeitet. Sollte dann eine Pause zwischen zwei Jobs gemacht werden, wäre es irgendwie schöner, wenn man dies hier in den Jobs festlegen kann.
Andererseits gibt es natürlich auch Zeitpunkte an denen die Jobliste keine Jobs beinhaltet, dann sollte natürlich auch der Thread nicht wirklich viel tun, deshalb würde ich dir empfehlen, dass du den Thread immer schlafen legst (self.suspend) und den von außen halt einfach aufweckst, wenn der schläft bevor und du einen Job einfügst.