um in einem Prüfsystem die Daten (z.B. Prüfstati) zwischen Realtime-Thread und Visualisierung auszutauschen, habe ich eine Klasse programmiert,
die versucht, über ein Transport-Record die Daten zur Visualisierung (ins Visu-Record) bzw. zum Realtime-Thread (ins Ctrl-Record) zu kopieren.
Über InterlockedCompareExchange stelle ich sicher, dass entweder Visualisierung oder Realtime-Thread auf das Transport-Record zugreifen dürfen.
Visu und Ctrl werden zyklisch durchlaufen, die Visu etwa alle 50ms, der Realtime-Thread (Ctrl) so, wie es die Applikation erfordert, typischerweise so 1-20ms.
Visu bzw. Ctrl haben jeweils ihre Kopie des Records, aus der sie lesen bzw. in das sie schreiben dürfen.
Alle paar ms versuchen Visu bzw. Ctrl, auf den Transport-Record zuzugreifen, um die Daten zu schreiben bzw. zu lesen. Hier darf nur entweder die Ctrl oder die Visu zugreifen. Wenn die Visu oder die Ctrl das Transport-Record lesen oder schreiben wollen, es jedoch gerade durch den anderen Thread bearbeitet wird, dann wird das zu einem späteren Zeitpunkt nochmal versucht. Für Lese- und Schreibrichtung sind jeweils unterschiedliche Records vorgesehen:
Ein Record VTC (Visu To Ctrl) und ein Record CTV (Ctrl to Visu), von denen es jeweils drei Exemplare gibt:
in dem Exemplar der Ctrl darf die Ctrl zu jeder Zeit schreiben oder lesen
in dem Exemplar der Visu darf die Visu zu jeder Zeit schreiben oder lesen
Momentan muss ich für jeden Anlagenteil mit eigenem Formular diese Visu-Klasse ableiten, um den Record genauer zu definieren und die Schritte zum Kopieren
des Records anzugeben. Diese sind jedoch immer gleich, nur der Typ ist anders. Es ist aber immer eine Zuweisung Record zu Record.
Abgeleitete Klasse:
Code: Alles auswählen
type
TMainVisu = class( TVCClass )
protected
procedure CTCopy; override;
procedure VTCopy; override;
public
VTCData: array[ TCTV ] of TVTCData; // Visu to Ctrl
CTVData: array[ TCTV ] of TCTVData; // Ctrl to Visu
// procedure VTCDoChangesC; override; // if needed
// procedure CTVDoChangesV; override; // if needed
// procedure DoUpdateByVisu; override; // if needed
// procedure DispCycle; override; // if needed
// procedure AktCycle; override; // if needed
end;
Wenn die Visu Zugriff auf das Tramnsport-Record hat, dann passiert dies:
Code: Alles auswählen
procedure TMainVisu.VTCopy;
begin
VTCData[ T ] := VTCData[ V ];
CTVData[ V ] := CTVData[ T ];
inherited;
end;
Code: Alles auswählen
procedure TMainVisu.CTCopy;
begin
VTCData[ C ] := VTCData[ T ];
CTVData[ T ] := CTVData[ C ];
inherited;
end;
Kann ich das irgendwie schöner lösen? Also z.B. indem ich 'irgendwie' in der Elternklasse angebe, dass ein Record in ein Record gleichen Typs kopiert wird,
ohne dass der Typ weiter spezifiziert ist? Und dann eine allgemein gehaltene Kopierroutine aufrufen?
Gut fände ich, wenn ich einer abgeleiteten Klasse nur den Typ des Records mitteilen müsste, ohne dass ich die o.a. Kopierroutinen jedesmal per Copy und Paste wieder zu der abgeleiteten Klasse angeben muss
Oder noch ganz anders lösen?
Viele Grüße
Arno