Napisałem program, który wykonuje następujące ...Czy istnieje sposób, aby mój program delphi czekał na skopiowanie dużej liczby plików?
- Monitory folder do tworzenia nowego pliku z określonego pliku, który ostatecznie zostanie utworzony w folderze sub.
- Po utworzeniu pliku ścieżka do podfolderów jest dodawana do kolejki w postaci TList.
- Pliki muszą zostać przetworzone w kolejności tworzenia.
- Procedura jest wywoływana w celu przetwarzania wszystkich plików (w tym przypadku obrazów) w podfolderze, który obejmuje przenoszenie plików do lokalizacji sieciowej.
- Ścieżka podfolderu jest usuwana z kolejki (TList).
- Jeśli w kolejce istnieje więcej ścieżek, następna ścieżka zostaje przekazana do procedury przetwarzania.
Problem mam jest to, że czas, aby skopiować pliki do lokalizacji sieciowej różni się w zależności od liczby i wielkości, dzięki czemu obrazy ...
Czy istnieje sposób, aby uzyskać Delphi czekać dla procedury operacji na plikach do końca?
Próbowałem pętli, która czekała na zmianę wartości boolowskiej (zmieniona, gdy ostatni plik do skopiowania został znaleziony w sieci), ale która zawiesiła aplikację (nawet z application.processMessage) i składnik dirMonitor nie powiodło się dodaj następny podkatalog do TList.
Wszelkie sugestie będą mile widziane.
Z góry dziękuję.
Dzięki za replys ...
miałem przyjrzeć OmniThread który wygląda idealny ... chociaż mam dostęp do Delphi 7 więc jej nie tylko iść.
Problem polegający na tym, że przenoszenie folderów zajmuje różną ilość czasu ze względu na różne rozmiary i ruch sieciowy itp. Gdy po folderze z dużą liczbą zdjęć następuje folder zawierający tylko kilka zdjęć, mniejszy z nich dociera najpierw do miejsca docelowego sieci. Sieć docelowa jest zewnętrznym buforem wydruku, więc wydruki są wyłączane w niewłaściwej kolejności.
Kod uproszczony:
procedure TForm1.programTimerTimer(Sender: TObject);
begin
if (fileOperationInProgress = false) AND (programPaused = false) then
begin
processOrderQueue;
end;
end;
procedure TForm1.processOrderQueue;
begin
// gets folder paths from queue
// processes images
// copy to print spooler (network location)
copyFolder(fromPath, toPath);
// remove temp files
end;
procedure TForm1.copyFolder(copyFrom : String; copyTo : String);
var
fos : TSHFileOpStruct;
begin
fileOperationInProgress := True;
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_COPY;
fFlags := FOF_FILESONLY or FOF_SILENT;
pFrom := PChar(copyFrom);
pTo := PChar(copyTo)
end;
ShFileOperation(fos);
fileOperationInProgress := False;
end;
Pomyśl mam wymyślić odpowiedź ... Mam zamiar zrobić wszystkie operationions plików w jednym wątku i ustawić globalny „zajęty” Boolean po uruchomieniu i zmień go ponownie po zakończeniu. W ten sposób monitor powłoki nie ominie wiadomości, gdy trwają operacje na plikach.
Z jakiej funkcji kopiuje się pliki? [SHFileOperation] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164%28v=vs.85%29.aspx)? – RRUZ
W jaki sposób kopiujesz pliki? Proszę pokazać kod. –
Możesz spróbować naśladować przykład Gabra w [kopia-plik-w-wątku] (http://stackoverflow.com/questions/1766626/copy-file-in-a-thread). Główny wątek jest powiadamiany po zakończeniu kopiowania. –