Problem mit selbst geschribenen Kopierprogramm



  • Hallo zusammen,

    Ich habe ein kleines Kopierprogramm geschrieben, das Daten von einem USB-Stick auf die Festplatte kopiert. Soweit kein Problem.

    Allerdings möchte ich in einem Label anzeigen, welche Datei gerade kopiert wird.

    Jetzt zu meinem Problem, wenn ich das implementiert habe und dies Teste, bekomm ich vom Hauptprogramm die Meldung (Keine Rückmeldung), Das Label wird nicht beschrieben und ändert sich auch nicht.

    Sobald das kopieren abgeschlossen ist, läuft meine Programm einwandfrei weiter.

    Meine Frage mit welchem Mittel schaff ich es das Label in "Echtzeit" ändern zu lassen?

    Entwicklungsumgebung ist Visual Studio, sprache C++, Anwendung ist eine Win32

    mfg Christian



  • Das müsstest du mit Threads machen.Weil dein Programm läuft im Moment nur synchron.Durch die Threads, kannst du es asynchron laufen lassen, ein Thread zum kopieren und einen zum Anzeigen des Lables



  • Danke Firefighter,

    ich habe zuerst an Interrupts gedacht, nur konnte ich nichts passendes dazu finden.

    mfg Christian



  • Ich glaube das wäre ein krasser overhead.Als kleiner Tip, versuch das ganze mit C# zu implementieren, da hast du den sogenannten "Background Worker" der übernimmt die ganze Thread geschichte für dich, du musst nur noch implementieren was während des Threads passieren soll.



  • Das wäre dann der einfache Weg 🙂
    Aber ich möchte bei C++ bleiben, da ich das ganze auch als Übung für mein Studium nutze.



  • Guck dir die Boost an, die hat eine nette Threading-Library dabei.
    (Da diese komplett überarbeitet wurde kann ich die Boost nun auch wieder für Threading empfehlen 🙂 )

    Da schreibst du dann z.B. nurmehr:

    class MyDialog : ...
    {
    public:
        ~MyDialog()
        {
            // warten bis der thread fertig ist
            if (m_copyThread)
                m_copyThread->join();
        }
    
        void StartCopy(boost::shared_ptr<FileList const> const& fileList)
        {
            assert(!m_copyThread);
            m_copyThread.reset(new boost::thread(boost::bind(&MyDialog::CopyThreadFunction, this, fileList)));
        }
    
        void CopyThreadFunction(boost::shared_ptr<FileList const> fileList)
        {
            // ...
        }
    
    private:
        boost::shared_ptr<boost::thread> m_copyThread;
    };
    

    Auch nicht viel mehr Aufwand als mit den .NET Framework.

    Natürlich musst du immer noch aufpassen "korrekt" mit dem GUI Thread zu kommunizieren -- bzw. überhaupt dass die beiden Threads sich nicht in die Quere kommen. Wenn du die WinAPI verwendest geht das aber oft sehr einfach über PostMessage/SendMessage.



  • naja, ein thread mit der winapi zu erstellen ist auch nicht schwer, allerdings ist es dann ebend nicht mehr plattformunabhängig und kein reines c++ mehr.

    eine funktion mit folgender Signatur enthält den Code der in einem andeen Thread ausgeführt werden soll.

    DWORD WINAPI ThreadFunc( LPVOID param)
    {
    }
    

    um den thread zu starten brauch man nur

    IrgendeinTyp param;
      DWORD tid;
      CreateThread(NULL, 0, &ThreadFunc, &param, 0, &tid);
    

    aufrufen



  • hustbaer schrieb:

    (Da diese komplett überarbeitet wurde kann ich die Boost nun auch wieder für Threading empfehlen 🙂 )

    Ist zwar OT, aber was war denn los, mit der Thread-Bibliothek?


Anmelden zum Antworten