Einzelnen Beitrag anzeigen

Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Comport-Hardwareausgabe verlangsamt Programmablauf

  Alt 6. Jul 2007, 10:58
Hi

Ich habe meinen Thread so erstellt:

Delphi-Quellcode:
  TSendRs232Event = procedure () of object;
  TSendRs232Thread = class(TThread)
  private
    FSendRs232Event:TSendRs232Event;
  protected
    procedure Execute; override;
  public
    constructor create(SendRs232Event:TSendRs232Event);
  end;

{...}

  type
  TConfig = class(TForm)
{...}
    comport: TCommPortDriver;
    procedure SendRs232();
{...}
  public
    rs232frame:array of array[0..5] of Byte;
    rs232frame_locked:boolean;
    Thread_closed:boolean;
  end;
Und das hier ist der Code für den Thread:

Delphi-Quellcode:
//-------------------------------------------------

constructor TSendRs232Thread.Create(SendRs232Event:TSendRs232Event);
begin
  inherited create(false);
  FSendRs232Event:=SendRs232Event;
  Priority := tpHigher;
  FreeOnTerminate := true;
end;

procedure TSendRs232Thread.Execute;
begin
  inherited;
   config.Thread_closed:=false;
  config.SendRs232();
   config.Thread_closed:=true;
  Terminate;
end;

procedure Tconfig.SendRs232();
begin
  repeat
    if (not rs232frame_locked) then
    begin
      rs232frame_locked:=true;
      if length(rs232frame)>0 then
      begin
        config.comport.SendData(@config.rs232frame[length(rs232frame)-1],6);
        setlength(rs232frame,length(rs232frame)-1);
      end;
      rs232frame_locked:=false;
    end;
    sleep(1);
  until shutdown;
end;
//-------------------------------------------------
Das Hauptprogramm hat dann den Neuen zu sendenden Wert in eine globale Variable (rs232frame) kopiert:

Delphi-Quellcode:
  with config do
  begin
    repeat
      if not rs232frame_locked then
      begin
        rs232frame_locked:=true;
        setlength(rs232frame,length(rs232frame)+1);
        for i:=0 to 5 do
          rs232frame[length(rs232frame)-1][i]:=rs232frame_new[i];
        rs232frame_locked:=false;
      end;
      sleep(1);
    until rs232frame_locked=false;
  end;



So, ich weiß, dass derzeit folgendes unsinnig ist:

a) die repeat-Schleife verzögert das Hauptprogramm ebenfalls - muss mich aber erst mal mit Ringpuffern auseinandersetzen -> also anderes Problem
b) derzeit liegt die Comport-Komponente noch in der Hauptform. "comport: TCommPortDriver" müsste doch irgendwie in den Thread rein, oder?


ciao,
Christian!
Angehängte Dateien
Dateityp: zip pc_dimmer_com_190.zip (136,8 KB, 4x aufgerufen)
Christian Nöding
  Mit Zitat antworten Zitat