Aufruf Funktion in abgel. Klasse mit 'Generic Record'

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
aseitzinger
Beiträge: 10
Registriert: Mi 18. Apr 2012, 15:07

Aufruf Funktion in abgel. Klasse mit 'Generic Record'

Beitrag von aseitzinger »

Hallo Forum,

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;


Wenn die Ctrl Zugriff auf das Transport_Record hat, passiert jenes:

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

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Aufruf Funktion in abgel. Klasse mit 'Generic Record'

Beitrag von fliegermichl »

Wenn die Records die gleiche Größe haben und keine Ansistrings enthalten, kann man mittels Move die Daten kopieren. Hier gibt es allerdings keinerlei Prüfungen.

aseitzinger
Beiträge: 10
Registriert: Mi 18. Apr 2012, 15:07

Re: Aufruf Funktion in abgel. Klasse mit 'Generic Record'

Beitrag von aseitzinger »

Move will ich nicht verwenden, da in den Records ja auch verwaltete Typen sein können, die dann kaputt sind

Antworten