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!