Indy Übertragung in Thread auslagern



  • Hey,

    ich hab das Problem das meine Rechner während der Indy Übertragung TCPServer->TCPClient hängen. Der Stream der übertragen wird ist ein Screenshot (jpeg komprimiert) also nur noch ca. 100-200 kb groß.
    Das Problem ist weniger die Größe des Streams, das Problem ist das der Stream nach dem er gesendet wurde, gleich erneut gesendet wird (mit einem neuen Screenshot).

    Während der Übertragung soll der Client aber noch die Möglichkeit haben auf das Programm zuzugreifen.

    Mit IdAntiFreeze bzw. Application->ProcessMessages() funktioniert das, aber nicht so ganz wie ich es mir vorstelle. Ausserdem ist die CPU immernoch voll ausgelastet.

    Aus diesem Grund versuche ich jetzt den Transfer in einen eigenen Thread zu verlagern.
    Dazu hab ich mir dieses Beispiel angeschaut: http://bcb-tutorial.c-plusplus.net/Thread/artikel7.html

    Nach diesem Beispiel möchte ich meinen Thread auch aufbauen.

    Aber sollte ich nicht nur den Transfer sondern die ganze Verbindung über diesen Thread laufen lassen und somit die Indy Komponenten in dem Thread selbst erstellen.

    -der Thread gibt den Stream an frm_viewer und wartet/empfängt den nächsten.
    -frm_viewer ladet das Bild aus dem Stream und zeigt es an.



  • Habs hinbekommen, nur jetzt hab ich eine kleine Frage!

    Wenn ein Thread terminiert wird ist dann der Zeiger = NULL ?

    Ich würde gern den Thread Zeiger erst dann wieder anlegen, wenn der Thread alles abgearbeitet hat.

    Den Thread selbst lass ich am Ende von

    void __fastcall TVerbindungThread::Execute()

    durch

    this->Terminate();

    terminieren.

    void __fastcall Tfrm_viewer::timer_screenreqTimer(TObject *Sender)
    {
    timer_screenreq->Enabled=false;	//verhindert, das eine erneute Screeshotanfrage
    											//gestartet wird.
    if(cb_autoreq->Checked)
    {
    	if(Verbindung == NULL)
    	{
    		Verbindung = new TVerbindungThread(ip,port,TOut,quali);
    	}
    }
    timer_screenreq->Enabled=true;	//timer wieder aktivieren
    }
    //---------------------------------------------------------------------------
    

    diese Abfrage if(Verbindung == NULL) ... in dem Timer soll verhindern, das der Thread mehr als einmal gleichzeitig gestartet wird. Aber der Startet ihn jetzt nur EINMAL! was mach ich falsch ?



  • ich hab einfach eine neue Variable angelegt und setzte diese wärend der thread läuft auf true und kurtz vor dem return auf false

    hab jetzt aber ein neues prob!

    void __fastcall TVerbindungThread::Execute()
    {
    
    	TCPClient2->Connect(TOut);
    
    	if(!TCPClient2->Connected())
    	{
    		Synchronize(VerbindungVerloren); // <----wieso geht er hier nie hin?!
    	}
    ...
    

    Wenn die Verbindung verloren ist, soll der Thread nicht mehr aufgerufen werden.
    Aber er geht nicht in die if-Anweisung. bei einem TimeOut beendet er glaub ich sogar aus den Thread ?!

    nichtmal ein try ... catch funktioniert!

    try
    {
    	TCPClient2->Connect(TOut);
    }
    catch ( EIdConnectTimeout *E ) // Exception abfanngen
    {
    	ShowMessage("Verbindung zum Server verloren!");
    }
    

    hier http://kripserver.net/hbfi05a/clients/projekt.rar könnt ihr euch das ding mal anschaun


Log in to reply