idTCPClient friert ein, trotz AntiFreeze.



  • Mein Client-Programm fragt über einen Timer immer ab, ob der Server eine Nachricht gesendet hat.

    void __fastcall TForm1::ClientTimerTimer(TObject *Sender)
    {
      AnsiString Line;
    
      if(TCPClient->Connected())
      {
        Line = TCPClient->ReadLn("\0",1000,1000);
      }
      else
      {
        return;
      }
    
      if(Line == "")
      {
        return;
      }
    
    //.....
    
    }
    

    Solange der Server eine Nachricht sendet, funktioniert alles wunderbar.
    Solange der Server keine Nachricht sendet, also der Codeabschnitt

    if(Line == "")
      {
        return;
      }
    

    ausgeführt wird, dann friert mein Programm ein.
    TIdAntiFreeze ist auf der Form drauf.
    Muss ich den noch irgendwie mit der Clientklasse verbinden?
    Gibt e noch andere Möglichkeiten, wie man das einfrieren verhindert?



  • Hallo,
    habe noch nie so wie du ein Server-Client-Programm geschrieben, aber wenn dein Server ohne Select arbeitet, ist das Senden und Empfangen ein sogenannter Blocking Call, bei dem das Programm während des Wartens einfriert..
    Weiß wie gesagt allerdings nicht, wie das bei deinem TCPClient aussieht.
    Grüße



  • Was heißt denn Server ohne select?

    Brauchst du irgendwelche Informationen von meinem TCPClient? Wenn ja, welche?



  • Ehm, ich weiß grad nicht ob ich mit meiner Aussage völlig falsch lag, da du ja mit diesem idTCPClient arbeitest..
    Hatte jetzt spontan an dieses Tutorial gedacht: http://www.c-worker.ch/tuts/select.php
    Ist ohne irgendwelche VCL-Komponenten und mit select, bedeutet, dass der Server mehrere Clients aufnehmen kann. Weiß allerdings nicht, ob du damit jetzt etwas anfangen kannst 😉



  • So ich habs jetzt gelöst.

    Der Fehler lag in der Zeile:

    Line = TCPClient->ReadLn("\0",1000,1000);
    

    Der zweite Parameter ist der Timeoutparameter. Ich habe also immer eine Sekunde das Programm blockiert.

    Wenn ich die Zeile ändere in

    Line = TCPClient->ReadLn("\0",5,1000);
    

    , dann funktioniert alles perfekt.

    Ich bedanke mich für deine Hilfe.


Anmelden zum Antworten