CopyFileEx blockiert Anwendung



  • Hallo,

    habe mir eine WINAPI Anwendung geschrieben, die Ordner und Dateien von CD auf ein wählbares beschreibbares
    Laufwerk kopiert. Arbeite hier mit der Funktion CopyFileEx. Die Software arbeitet auch ohne Probleme.
    Zur Kontrolle lasse ich mir das Ergebnis welche Datei gerade kopiert wird u.s.w. , anzeigen.
    Verschiebe ich nun das Fenster an eine andere Stelle, wird weiter kopiert aber die Anzeige der Daten
    in den Editboxen bleibt stehen.

    Suche jetzt schon seit ein paar Tagen ohne Erfolg nach einer Lösung.
    Kann mir jemand einen Tipp geben, wie das zu ändern ist?

    Arbeite mit Dev-C++.

    Hier ein Auszug wo die Kopierfunktion gestartet wird:

    case WM_COMMAND:
    {
    
        if(lParam==(LPARAM)hButtonExit && HIWORD(wParam)==BN_CLICKED) // Button beenden
        {   
            SendMessage(hwnd,WM_CLOSE,0,0);
        }
    
        if(lParam==(LPARAM)hButtonDna && HIWORD(wParam)==BN_CLICKED) // Button starten
        {
            char szTextTo[256];                  
    
            // Text aus der Editbox holen
            GetWindowText (hwndTo, szTextTo, 256);
            GetWindowText (hwndZiel, szTextTo, 256);
            // Diesen Text in das Label schreiben und
            // den Text der Editbox löschen
            SetWindowText (hwndZiel, szTextTo);
            SetWindowText (hwndTo, szTextTo);
    
            char lwBuchstabe[1];
            lwBuchstabe[0] = szTextTo[0];
    
            if(laufwerke(lwBuchstabe)!=true)
            {
                MessageBox(hwnd, "Das angegebene Laufwerk ist nicht vorhanden!\n"
                           "oder eine CD-ROM! Bitte Eingabe korrigieren.",
                           "",MB_OK | MB_ICONERROR);     
            }
            else
            {
                int gesamt;
                gesamt = rekursivDirFileSize(lauferkFrom);//Gesamtgröße in Byte ermitteln
                                                          //Übergabe an die rekursive Funktion
                                                          //kopieren!
    
                         kopieren(hwndPB,// Daten an InitCommonControls() senden
                         hwndTextDatei, // Daten zum Anzeigen der bereits kopierten Dateien.
                         hwndDateiGroesse,// Daten zum Anzeigen der Dateigröße.
                         hwndDateiAnzahl, // Anzahl der bereits kopierten Dateien
                         lauferkFrom, // Startlaufwerk
                         szTextTo,// Ziellaufwerk
                         gesamt); //Rekursive Funktion zum kopiren und ausgeben der Daten
    
                char ergebnis[256];
                strcpy(ergebnis,"Kopieren nach "); 
                strcat(ergebnis,szTextTo);
                strcat(ergebnis," erfolgreich beendet");
    
                MessageBox(hwnd, ergebnis,"", MB_OK);
    
                DestroyWindow(hwnd);
    
              }
        }
        return 0;
    }
    

    Bin leider noch blutiger Anfänger und würde mich über jeden Hinweis freuen.



  • CreateThread



  • Hallo,

    erst einmal viele Dank für Deine Antwort.
    Hatte das auch einmal gemacht, jedoch keine Änderung im Verhalten festgestellt
    und zum Ende hängt sich alles auf.

    Hier mein Code und was müßte ich ändern?

    unsigned long nThreadID ;
    HANDLE hThread = CreateThread (NULL,
                                   0,
                                   (LPTHREAD_START_ROUTINE)
                                   kopieren(hwndPB, 
                                            hwndTextDatei, 
                                            hwndDateiGroesse,
                                            hwndDateiAnzahl,
                                            lauferkFrom,
                                            szTextTo,
                                            gesamt),
                                   0,
                                   0,
                                   &nThreadID);
    CloseHandle(hThread);
    


  • Opscript schrieb:

    Hallo,

    erst einmal viele Dank für Deine Antwort.
    Hatte das auch einmal gemacht, jedoch keine Änderung im Verhalten festgestellt
    und zum Ende hängt sich alles auf.

    Das ist auch nicht verwunderlich...

    Du übergibt hier ja auch ne falsche (bzw. gar keine) Thread-Prozedur.
    Weiterhin beendet killst du einfach den Handle zum Thread, obwohl der (warscheinlich)
    noch läuft.
    Guck dir am besten nochmal n Tutorial an: http://www.codeproject.com/useritems/MultithreadingTutorial.asp



  • Vielen Dank an CodeFinder.
    Guter Tipp, hat somit das Problem gelöst und hab noch einiges dazu gelernt.


Anmelden zum Antworten