Indy - TCPServer und Synchronize



  • Hallo,

    kann mir jemand sagen, wie man Synchronize für die Threads des TIdTCPServers korrekt aufruft?
    Bei meinen Versuchen hängt sich das Programm genau beim Synchronize auf, die UpdateMemo-Funktion wird gar nicht erreicht.

    Hier mal mein Beispielprojek (Memo, Button, TIdTCPServer, TIdTCPClient):

    // in .h unter public:
      String buffer;
      void __fastcall UpdateMemo();
    
    // .cpp
    
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      IdTCPServer1->Active = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      IdTCPClient1->Connect(1000);
      if (IdTCPClient1->Connected())
      {
        IdTCPClient1->SendCmd("TestTest");
        IdTCPClient1->Disconnect();
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::UpdateMemo()
    {
      Memo1->Text = buffer;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::IdTCPServer1Execute(TIdPeerThread *AThread)
    {
      buffer = AThread->Connection->ReadLn("\r\n", 1000, 1000);
      AThread->Synchronize(&UpdateMemo);
    }
    //---------------------------------------------------------------------------
    

    Ein eventuell damit zusammenhängende Frage: warum muss ich in Synchronize die Funktion als Referenz übergeben? Wenn ich das & weglasse beschwert sich der Compiler
    E2285 Could not find a match for 'TIdBaseThread::Synchronize(void)'

    In den Newsgroups habe ich dazu den Tip gefunden, in IdThread.hpp die zweite Deklaration von Synchronize auszukommentieren (HIDESBASE void __fastcall Synchronize(const System::TMethod &Method)/ overload /;).
    Damit kann ich zwar ohne das '&' kompilieren, das Programm hängt sich aber trotzdem beim Synchronize auf. Und ganz ohne Synchronize friert es natürlich auch ein.

    Danke im Voraus für alle Tips!


Anmelden zum Antworten