Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 12:50
Hallo,
Da der Record nur durch RS232 abgefüllt wird, werde ich
beim Empfang fertig ein Flag setzen, und beim beginn des Empfangs
natürlich rücksetzen. Dies lässt sich leicht lösen in der OnRXBuff procedur.
Das wäre dann die Freigabe um die Daten zu lesen.
(die Status Daten von der CNC werden nur gelesen).
Das ist eigentlich unnötig, denn diese Zugriffe kannst du erheblich besser mit einer CriticalSection absichern.
Delphi-Quellcode:
type
  TMyClass = class( TThread )
  private
    FCS : TCriticalSection;
    FStatus : TCNCStatus;
    procedure SetStatus( const Value : TCNCStatus );
    function GetStatus : TCNCStatus;
  protected
    procedure Execute; override;
  public
    property Status : TCNCStatus read GetStatus;
  end;

procedure TMyClass.Execute;
var
  LStatus : TCNCStatus;
begin
  inherited;
  while not Terminated do
    begin
      // Warten auf ein Empfangs-Signal

      // Irgendwie den Status empfangen
      LStatus := ...

      // öffentlichen Status setzen
      SetStatus( LStatus );
    end;
end;

procedure TMyClass.SetStatus( const Value : TCNCStatus );
begin
  FCS.Enter;
  try
    FStatus := Value;
  finally
    FCS.Leave;
  end;
end;

function TMyClass.GetStatus : TCNCStatus;
begin
  FCS.Enter;
  try
    Result := FStatus;
  finally
    FCS.Leave;
  end;
end;
Der Trick hierbei ist es, die möglichen zeitlichen Überschneidungen so gering wie nur möglich zu halten. Da die Daten aber zunächst in eine lokale Variable geschrieben werden reduziert sich die Überschneidung auf das Auslesen/Setzen des Record-Inhalts und ist daher sehr kurz.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (26. Mai 2014 um 12:55 Uhr)
  Mit Zitat antworten Zitat