AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Verzeichnisse mit unsynchronisiertem Thread kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verzeichnisse mit unsynchronisiertem Thread kopieren

Ein Thema von MichaelN2703 · begonnen am 23. Okt 2007 · letzter Beitrag vom 23. Okt 2007
Antwort Antwort
MichaelN2703

Registriert seit: 23. Okt 2007
1 Beiträge
 
Delphi 2005 Architect
 
#1

Verzeichnisse mit unsynchronisiertem Thread kopieren

  Alt 23. Okt 2007, 16:35
Hallo,

ich möchte aus einer Anwendung heraus nach Auswahl des Nutzers zeitgleich mehrere Kopierprozesse zeitgleich starten.

Folgende Schritte werden beim kopieren ausgeführt:

1. Alle ausgewählten Programme werden als lokale Kopie im eingestellten Temp-Verzeichnis zwischengespeichert
2. Sollten im (bereits vorhandenen) Zielverzeichnis standortspezifische Dateien vorhanden sein, werden diese ebenfalls in diesem Tempverzeichnis zwischengespeichert
3. Zielverzeichnis wird gelöscht
4. Programm wird kopiert
5. Standortspezifische Dateien werden zurückgeschrieben
6. Tempverzeichnis wird gelöscht.

Ich hatte zuerst einen Thread erzeugt, in einer Schleife diesen wieder angestoßen, als globale Variable jeweils das Start- und das Zielverzeichnis übergeben. Das Problem war dann, das einige Verzeichnisse nicht kopiert wurden, also hatte ich mehrere Threads verwendet, jetzt klappte das kopieren.

Delphi-Quellcode:
case XX of
  1 : begin
        Zieldatei_1_Thread := Zieldatei;
        Quelldatei_1_Thread := Quelldatei;
        Zieldatei_2_1_Thread := Zieldatei_2;
        Quelle1 := FileListComplete[1].Location;
        Ziel1 := FileListComplete[UpdateIndex].Location;
        Programm1 := FileListComplete[1].FileParam[k_1].Name;
        MyThread_1 := TMyThread_1.create;
        MyThread_1.Resume;
        setlength(ThreadHandleListe,length(ThreadHandleListe)+1);
        ThreadHandleListe[length(ThreadHandleListe)-1] := MyThread_1.Handle;
      end;

  2 : begin
        Zieldatei_2_Thread := Zieldatei;
        Quelldatei_2_Thread := Quelldatei;
        Zieldatei_2_2_Thread := Zieldatei_2;
        Quelle2 := FileListComplete[1].Location;
        Ziel2 := FileListComplete[UpdateIndex].Location;
        Programm2:= FileListComplete[1].FileParam[k_1].Name;
        MyThread_2 := TMyThread_2.create;
        MyThread_2.Resume;
        setlength(ThreadHandleListe,length(ThreadHandleListe)+1);
        ThreadHandleListe[length(ThreadHandleListe)-1] := MyThread_2.Handle;
      end;
end;
Um die zwischengespeicherten Dateien zurückzuschreiben und das Tempverzeichnis wieder zu löschen warte ich am Ende der Schleife im Hauptprogramm auf das Ende der Threads:

WaitErgebnis:= WaitForMultipleObjects( length(ThreadHandleListe),@ThreadHandleListe[0],true,INFINITE); Währen des Kopierprozesses soll als Caption eines Labels angezeigt werden, was gerade passiert, ich habe die Threads erweitert:

Delphi-Quellcode:
  
type
  TMyThread_2 = class(TThread)
  private

    { Private-Deklarationen }
  protected
    procedure Execute; override;

  public
    constructor create; virtual;
  end;


  
procedure TMyThread_2.Execute;
  var
  SHFileOp : TSHFileOpStruct;
  szFrom : array[0..128] of Char;
  szTo : array[0..128] of Char;

  // Strings für Caption des Labels im Hauptformular
  Kopierhinweis_2: String;
  Kopierhinweis_3 : String;
  Quelle : String;
  Ziel : String;
  Programm : String;

  // Pfade
  Zieldatei_thread, Quelldatei_thread, Zieldatei_2 : String;


begin
  Quelle := Quelle2; //globle Variable
  Ziel := Ziel2; //globle Variable
  Programm := Programm2; //globle Variable

  Kopierhinweis_3 := Kopierhinweis; //globle Variable
  Kopierhinweis_2 := '';
  Kopierhinweis_2 := Text_142 + Programm + Text_143 + Quelle + Text_144 + Ziel;

  freeonterminate := False;
  Zieldatei_thread := Zieldatei_2_Thread;
  Quelldatei_thread := Quelldatei_2_Thread;
  Zieldatei_2 := Zieldatei_2_2_Thread;

  if DirectoryExists(ExcludeTrailingPathDelimiter(Zieldatei_2)) = False then
    CreateDir(ExcludeTrailingPathDelimiter(Zieldatei_2));

  // Puffervariablen initialisieren
  FillChar(SHFileOp, Sizeof(SHFileOp), #0);
  FillChar(szFrom, Sizeof(szFrom), #0);
  FillChar(szTo, Sizeof(szTo), #0);
  StrPCopy(szFrom, Quelldatei_thread);
  StrPCopy(szTo, Zieldatei_thread );
  try
  with SHFileOp do
  begin
    Wnd := application.Handle;
    wFunc := FO_COPY;
    pFrom := @szFrom;
    pTo :=@szTo;
    fFlags := FOF_NOCONFIRMATION or FOF_NOERRORUI or FOF_NOCONFIRMMKDIR;
  end;

  finally

  end;
  Kopierhinweis := Kopierhinweis_3 +#10#13 + Kopierhinweis_2 + Text_146;
  freeonterminate := True;
  Exit;
end;


//-------- create (public) ---------------------------------------------
constructor TMyThread_2.create;
begin
  inherited create(true);
  Priority := tpIdle;
end;


Ich habe jetzt folgende Probleme:

Obwohl der Kopierprozess noch läuft (Fenster mit Progressbar der API) werden gelegentlich schon die nachfolgenden Schritte ausgeführt, da aber noch Daten kopiert werden wird u.a. das Tempverzeichnis nicht gelöscht.

Die Anwendung bremst das System stark aus, obwohl im Taskmanager weder CPU noch Speicher ausgelastet werden.

Der Inhalt der Kopierfenster wird kaum aktualisiert, auch in das Hauptfenster der Anwendung kommt man kaum zurück, die Anzeige des Labels ist somit kaum möglich.

Die Anwendung wird ausschließlich auf Netzlaufwerken ausgeführt, die Verbindung ist teilweise sehr langsam.

Die Anzahl der maximal möglichen Kopierprozesse habe ich auf 64 beschränkt (hatte ich als obere Grenze für WaitForMultipleObjects gefunden).

Kann mir jemand bei der Lösung meiner Probleme helfen?
Danke im Voraus

Michael
  Mit Zitat antworten Zitat
23. Okt 2007, 16:48
Dieses Thema wurde von "SirThornberry" von "Neuen Beitrag zur Code-Library hinzufügen" nach "VCL / WinForms / Controls" verschoben.
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz