IdTCPClient und Threadverarbeitung



  • Hallo Community

    Ich habe folgendes Probelm.
    Ich habe eine Anwendung die als Server fungiert. In Ihr nutze ich den
    IdTCPServer von Indy.
    Dann habe ich eine Clientanwendung, nutzt IdTCPClient von Indy.
    Im den Client habe ich einen eigenen Thread verfasst, der prüft ob der Client eine Nachricht vom Server erhält. somit möchte ich eine asynchrone Verarbeitung schaffen. Dies ist der Fall da ich den alten ServerSocket und ServerClient ersetzen möchte.

    Thread.cpp

    void __fastcall RecieveMessage::Execute()
    {
      while (!Terminated)
      {
    	try
    	{
    	  Sleep(500); // Thread schlafen schicken
    	  //Synchronize(GuiElements);  //Läuft nicht weiter???!!!
    	  GuiElements();
    	}
    	catch (...)
    	{
    	}
      }
    }
    void __fastcall RecieveMessage::GuiElements()
    {
          Nachricht = FormStempeln->TCPClient->IOHandler->ReadLn();
          FormStempeln->NachrichtenVerarbeitung(Nachricht); //Funktion zur Verarbeitung
    }
    

    Rufe ich die Funktion GuiElements() mit synchronize auf, bleiben beide Programme stehen und nichts tut sich mehr.

    Ruf ich sie ohne auf, hängt er sich bei einer Funktion zur Verarbeitung eines Strings auf den er in eine comboBox schreiben soll. Dort möchte ich die eigenschaft ComboBox->Sorted auf false ändern und bekommen die Fehlermeldung

    EOSError - Systemfehler - Code 5 - Zugriff verweigert
    

    Funktionsauschnitt:

    ComboBox1->Sorted = true;
      if (!alle)   // nur die letzten 5 Projekte
    	ComboBox1->Sorted = false; //Hier tritt der Fehler auf!
    

    Komm aber nicht dahinteR?!

    Zudem hab ich noch ein anderes Problem.
    Wenn sich mein Client abmeldet, dauert es ne Zeit
    und der Server hängt sich auf?!
    Ich hab ne Funktion beim Anmelden wo ich mir die Adresse der Clients merke
    und beim Abmelden lösch ich diese wieder.
    Danach steht der Server , Reagiert nicht mehr.

    void __fastcall TForm1::AdresseLoeschen(TIdContext *IndySocket)
    {
      AnsiString wStr = "Trennung ";
    
      EnterCriticalSection(&csSockets);
      for (int i=0; i < Max_BdeClientCount; i++)
      {
    	if (Indy[i] == IndySocket)
    	{
    	  LogOnline->LogWrite("2000  Logoff " + Typ[i] + " " + wStr + " "
    	+ Cmp[i] + " " + Ben[i]);
    
    	  Indy[i] = NULL;
    	  Cmp[i] = "";
    	  Ben[i] = "";
    	  Bem[i] = "";
    	  Typ[i] = "";
    	  AktualisierenListe();
    	  break;
    	}
      }
      LeaveCriticalSection(&csSockets);
    }
    

    Mfg
    Alex


Anmelden zum Antworten