Hi,
ich habe einen Thread, mit eine IdTCPClient, der beim Start ein paar Daten aus dem Hauptprogramm senden soll.
Deswegen habe ich dort eine for-schleife, die aus dem Hauptprogramm Daten holt, und per
TCP versenden soll. Mir ist schon klar, dass das alles vielleicht noch nicht ganz richtig ist, aber es handelt sich ja hier auch noch nicht um eine finale Version.
Ich greife auf eine ListView zu, und will für jedes Items eine
TCP-Nachricht verschicken.
Im Count steht auch definiv 6 drin, aber die Schleife wird nur einmal durchlaufen.
Er senden auch genau dieses erste Item, bzw. einen String aus diesem Items.
Aber danach macht er nicht weiter, der Thread scheint auch nicht mehr zu reagieren, jedenfalls empfängt der TCPClient dann keine Nachrichten mehr.
Die ganze Writelog's müßt ihr euch mal wegdenken, die sind nur für mich da, damit ich sehen kann wann wer was macht (oder halt eben nicht).
Hier mal meine Execute-Procedure:
Delphi-Quellcode:
procedure TTCPThread.Execute;
var
s,c:
string;
waage, command:
string;
i: Integer;
begin
Try
//FTCPClient.BoundIP:=FBindIP;
//FTCPClient.BoundPort:=FBindPort;
FTCPClient.host:=FHost;
FTCPClient.Port:=FPort;
FTCPClient.ConnectTimeout:=2000;
Synchronize(
Procedure
begin
frm_main.Writelog('
Init TCP-Connection');
end
);
FTCPClient.Connect;
if not FTCPClient.Connected
then
begin
Synchronize(
Procedure
begin
frm_main.Writelog('
TCP-Verbindung fehlgeschlagen');
end
);
Self.Terminate;
end else begin
Synchronize(
Procedure
begin
frm_main.Writelog('
TCP-Verbindung hergestellt');
end
);
//Diese Schleife wird genau einmal durchlaufen
//Es sind 6 Items in lv_waagen vorhanden
//Es wird aber lediglich lv_waagen.Items[0] verarbeitet
FCS.Acquire;
for I := 0
to frm_main.lv_waagen.Items.Count-1
do
begin
Synchronize(
Procedure
begin
frm_main.Writelog('
Sende Register '+inttostr(i)+'
von '+inttostr(frm_main.lv_waagen.Items.Count-1));
end
);
FTCPClient.SendCmd('
Register:'+frm_main.lv_waagen.Items[i].SubItems[2]+'
:@');
end;
FCS.Release;
end;
while not Terminated
do begin
if FErgebnisList.Count>0
then
SendeErgebnisse;
if FTCPClient.IOHandler.InputBufferIsEmpty
then
begin
FTCPClient.IOHandler.CheckForDataOnSource(100);
FTCPClient.IOHandler.CheckForDisconnect;
if FTCPClient.IOHandler.InputBufferIsEmpty
then Continue;
end;
s:=FTCPClient.IOHandler.InputBuffer.ExtractToString;
if s<>'
'
then
begin
Synchronize(
Procedure
begin
frm_main.Writelog(s + '
von '+ FHost);
end
);
while Pos('
@', s)>0
do
begin
c:=Copy(s,1,Pos('
@',s)-1);
s:=Copy(s,Pos('
@',s)+1,Length(s));
if Pos('
:',c)>0
then
begin
command:=Copy(c,1,Pos('
:',c)-1);
c:=Copy(c,pos('
:',c)+1,Length(c));
waage:=Copy(c,1,Pos('
:',c)-1);
if lowercase(command)='
st'
then
begin
Synchronize(
procedure
begin
frm_main.NachrichtenBufferAdd(FHost, FPort, s, command, waage, self);
end
);
end;
end;
end;
end;
//Sleep(1000);
Self.Suspend;
if Terminated
then
break;
end;
if FTCPClient.Connected
then begin
FTCPClient.SendCmd('
Disconnect');
FTCPClient.Disconnect;
end;
finally
if FTCPClient.Connected
then begin
FTCPClient.SendCmd('
Disconnect');
FTCPClient.Disconnect;
end;
FTCPClient.Free;
FErgebnisList.Free;
FCS.Free;
end;
end;
Sieht alles noch sehr wüst aus, daran bitte nicht stören.