Indy TcpServer nach connect auf 100%



  • Hallo Community,

    Ich habe ein Beispielprojekt geschrieben in dem ich einen Indytcpserver und einen tcpClient habe.
    der Client nutzt einen Thread um immer wieder abzufragen ob er Nachrichten vom Server bekommt.
    Im Server ist nur die einfache Komponente IdTcpServer.
    Funktioniert tadellos.
    Jetzt hab ich diese Verarbeitung in mein eigentliches Programm eingebaut
    um dort den ServerSocket zu ersetzten.
    Nun habe ich aber jedesmal nachdem sich ein Client am den Server anmeldet eine
    CPU-Auslastung von 100% beim Server!

    Ich komm aber nicht dahinter warum!? Es werden ein Paar Nachrichten verschickt und empfangen und danach nichts mehr.
    Dennoch ist der Server nach einem Connect auf 100%!

    Hat jemand eine Lösung/Idee?



  • Ich hab mittlerweile festgestellt das mein Server
    ständig in die Prozedure on Execute läuft sobald ein Client connectet ist.
    Ich verstehe jedoch nicht warum?!
    InputBuffer->Size ist immer 0
    und vom Client wird nichts mehr verschickt!?

    Warum läuft er dauernd in den OnExecute hinein?



  • vielleicht weil der Client eine Antwort erwartet aber keine kriegt ?



  • Wie sieht denn Dein Thread-Quellcode aus?



  • der Thread des Clients

    __fastcall RecieveMessage::RecieveMessage(bool CreateSuspended)
    	: TThread(CreateSuspended)
    {
      //Msg = new TStringList();
       FreeOnTerminate = true;
       SatzAnf  = SATZANF;       //StringTrennerZeichen def. in Unit1.h
       SatzTre  = SATZTRE;
       SatzEnd  = SATZEND;
    }
    //---------------------------------------------------------------------------
    void __fastcall RecieveMessage::Execute()
    {
    	//---- Thread-Code hier einfügen ----
    
      while (!Terminated)
      {
    
    	try
    	{
    	  //Sleep(500); // Thread schlafen schicken
    	  //Application->ProcessMessages();
    	  //Msg Holen!
    	  //Synchronize(GuiElements);
    	  GuiElements();
    	}
    	catch (...)
    	{
    
    	}
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall RecieveMessage::GuiElements()
    {
    	  if (!FormStempeln->TCPClient->IOHandler->RecvBufferSize  > 0)
    		return;
    
    	  Nachricht = FormStempeln->TCPClient->IOHandler->ReadLn();
    	  if(Nachricht.Length())
    	    FormStempeln->NachrichtenVerarbeitung(Nachricht); //FUnktion in der Unit1
    
    }
    //---------------------------------------------------------------------------
    

    Der Synchronize bringt das Programm iwie zum Anhalten?!
    aber an dem liegts ja nich...

    Hab mittlerweile den Server neu aufgesetzt, und siehe da es funktioniert?!
    keine 100% auslastung.
    Aber ich habe immernoch so phänomäne, das nach bestimmten aktionen, sich der Thread verabschiedet, in der Form das das Programm "KEINE RÜCKMELDUNG" mehr bekommt. ?! 😞


Anmelden zum Antworten