Hallo,
für ein Projekt habe ich eine
Unit geschrieben, die ich auch für andere Projekte verwenden möchte.
Diese
Unit soll mit einem Messgerät kommunizieren und von diesem Daten empfangen.
Zu diesem Zweck habe ich ein Klasse TLMG erstellt, die alle Attribute, Felder und Methoden enthält.
Delphi-Quellcode:
type
TLMG = class(TObject)
private
LMGClient: TIdTCPClient;
ReadDataThreadHandle: THandle;
ReadDataThreadID: Cardinal;
procedure ReadDataThread;
procedure Status(ASender: TObject;
const AStatus: TIdStatus; const AStatusText: string);
public
{ Public-Deklarationen }
run: boolean;
constructor Create(SHost: string; SPort: integer);
procedure LMGConnectThread();
end;
Den Constructor und den Verbindungsaufbau rufe ich aus einer Formularanwendung auf.
Delphi-Quellcode:
procedure TfrmMitMemo.btnShowInputClick(Sender: TObject);
begin
LMG1 := TLMG.Create('172.16.6.1', 24500);
LMG1.LMGConnectThread;
end;
Der Constructor sieht wie folgt aus:
Delphi-Quellcode:
constructor TLMG.Create(SHost: string; SPort: Integer);
begin
LMGClient := TIdTCPClient.Create();
LMGClient.Host := SHost;
LMGClient.Port := SPort;
LMGClient.OnStatus := Status;
end;
Für den Verbindungsaufbau gibt es in der
Unit die Methode
Delphi-Quellcode:
procedure TLMG.LMGConnectThread;
begin
try
LMGClient.Connect;
if LMGClient.Connected
then
begin
// Thread Starten
ReadDataThreadHandle := BeginThread(
nil, 0, @TLMG.ReadDataThread,
nil, 0, ReadDataThreadID);
end;
except
on E:
Exception do
begin
LMGClient.Disconnect;
LMGClient.Free;
end;
end;
end;
Bis hier hin funktioniert auch noch alle ganz gut.
Wenn ich jetzt jedoch die Methode ReadDataThread als Thread starten, siehe oben,
gibt es LMGClient im ReadDataThread nicht mehr.
Delphi-Quellcode:
procedure TLMG.ReadDataThread;
begin
LMGClient.Disconnect;
LMGClient.Free;
end;
Meine Frage:
Was muß ich anstellen damit ich LMGConnectThread als Thread in der Formularanwendung
und ReadDataThread in der
Unit als Thread aufrufen kann.
So z.B.
In der Formularanwendung
Delphi-Quellcode:
procedure TfrmMitMemo.btnShowInputClick(Sender: TObject);
var
LMGConnectThreadHandle: THandle;
LMGConnectThreadID: Cardinal;
begin
LMG1 := TLMG.Create('172.16.6.1', 24500);
LMGConnectThreadHandle := BeginThread(nil, 0, @TLMG.LMGConnectThread, nil, 0, LMGConnectThreadID);
end;
In der
Unit
Delphi-Quellcode:
procedure TLMG.LMGConnect;
begin
try
LMGClient.Connect;
if LMGClient.Connected
then
begin
// Thread Starten
ReadDataThreadHandle := BeginThread(
nil, 0, @TLMG.ReadDataThread,
nil, 0, ReadDataThreadID);
end;
except
on E:
Exception do
begin
LMGClient.Disconnect;
LMGClient.Free;
end;
end;
end;
Anbei die beiden Programmteile.
Für Anregungen und Beispiele wäre ich sehr dankbar.
MfG
Lars