Frage zu Threads



  • Hallo,

    ich bin gerade dabei ein Kopiervorgang zu starten und dann zu überwachen.

    Dazu möchte ich den Vorgang über CopyFile(); auslagern in einen Thread.

    Hab mich dort jetzt mal etwas durch "geklickt" und Frage mich gerade wie ich den
    Thread selber starte? Wenn ich extern ein Objekt des Threds anlege und dann so eine Funktion aufrufe wartet die Anwendung selber noch auf den Abschluß das scheint also nicht der richtige Weg zu sein 😉 Execute() selbst aber ist _protected und das sicherlich mit gutem Grund... Nun gelange ich aber ans Ende meines Wissens.

    Der Code sieht zZ so aus:

    HeaderFile

    //---------------------------------------------------------------------------
    
    #ifndef thDownloadH
    #define thDownloadH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    //---------------------------------------------------------------------------
    class download : public TThread
    {
    private:
    protected:
    	void __fastcall Execute();
    public:
    	__fastcall download(bool CreateSuspended);
    	int startDownload( AnsiString file, AnsiString to );
    };
    //---------------------------------------------------------------------------
    #endif
    

    CPP

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "thDownload.h"
    #include "fmDownload.h"
    #include <windows.h>
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    
    //   Important: Methods and properties of objects in VCL can only be
    //   used in a method called using Synchronize, for example:
    //
    //      Synchronize(&UpdateCaption);
    //
    //   where UpdateCaption could look like:
    //
    //      void __fastcall download::UpdateCaption()
    //      {
    //        Form1->Caption = "Updated in a thread";
    //      }
    //---------------------------------------------------------------------------
    
    __fastcall download::download(bool CreateSuspended)
    	: TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall download::Execute()
    {
      // startDownload(); ?¿
    }
    //---------------------------------------------------------------------------
    int download::startDownload( AnsiString file, AnsiString to )
    {
    	return CopyFile( file.c_str(), to.c_str(), true );
    }
    

    Externer Aufruf:

    download *dl;
       dl->startDownload( file, to );
    

    Nur ich glaube keineswegs das dies der richtige Weg ist den Thread zu starten.
    Aber genauso wenig weiß ich wie sonst 😞



  • Du startest den Thread einfach über den Konstruktor bzw. anschließend mit Resume():

    download *dl = new download(false);
    
    // bzw.
    
    download *dl = new download(true);
    // ...
    dl->Resume();
    

    Den eigentlichen Code für den Thread mußt du in download::Execute() schreiben.

    Aber dein Thread wartet natürlich auch, solange die Funktion "CopyFile" ausgeführt wird. Was willst du denn genau überwachen?



  • Wieder ein Stück schlauer.

    Natürlich wartet der Thread auch. Soll er ja auch. Nur die Anwendung selber läuft weiter.

    Meine Absicht ist es nun über einen Timer die Größe der Ursprungsdatei mit der Zieldatei zu vergleichen und so einen Status zu bekommen bzw. einen Statusbalken zu füttern.



  • Hallo

    Gute Idee (Anzeigen eines Kopierfortschritts) aber schlechte Umsetzung.
    Benutzt einfach CopyFileEx. Da kannst du eine Callback-Funktion angeben die dich automatisch über den Fortschritt ünterrichtet. Damit kannst du dir i.a. den ganzen Thread sparen.

    bis bald
    akari



  • Zumindest weiß ich nun wie ich einen Thread starte 😉

    Werde mir die Funktion mal anschauen, danke!


Anmelden zum Antworten