Einzelnen Beitrag anzeigen

Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

For-Schleife im Thread wird nur einmal abgearbeitet

  Alt 6. Jun 2014, 17:58
Delphi-Version: XE4
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)='stthen
              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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat