Вниз
Скачать: CL | DM;

Копирование файлов   Найти похожие ветки 

 
iNew ©   (2003-08-20 05:18) [0]

При копировании файлов с сетевого диска "G" на свой локальный мне нужно определить не залочен ли файл (FileOpen=-1) и если он залочен то подождать какое-то время.
Как мне это организовать? Просто сделать Sleep() или как-то ещё.


 
Babay ©   (2003-08-20 06:28) [1]

Ну можно конечно Sleep если время выполнения опреции не критично. А можно как бы скидывать его в очередь отработать другие а потом снова вернуться к файлам находящимся в очереди


 
iNew ©   (2003-08-20 09:10) [2]

А функция MsgWaitForMultipleObjects для этого не подойдет?


 
panov ©   (2003-08-20 09:33) [3]

Все зависит от конкретной ситуации.

Если у тебя есть список фалов которые нужно скопировать, то при последовательном проходе по списку имена обработанных файлов удаляем из списка. Заблокированные файлы просто пропускаем для последующей обработки по достижению конца списка.

Если есть необходимость обязательного последовательного копирования, то в этом случае придется ожидать в цикле. Если можно делать это в фоновом режиме - используй многопоточность.


 
iNew ©   (2003-08-20 11:42) [4]

Сделал копирование файлов в отдельном потоке. Копирование необходимо необходимо делать раз в 10 мин (автоматом).
Как лучше сделать? Убивать этот поток и создавать его заново, раз в 10 мин, или делать 10 минутную задержку в потоке.
И если делать 10 минутную задержку в потоке то как её лучше организовать?


 
clickmaker ©   (2003-08-20 12:14) [5]

В отдельном потоке можно и Sleep


 
panov ©   (2003-08-20 12:22) [6]

Лучше в потоке:


FTimeOut: Integer;
EndTime: TDateTime;
LastTime: TDateTime;
begin
FTimeOut := 1; //минута для примера
LastTime := now;
EndTime := now + (1/24/60)* FTimeOut;
while not Terminated do
begin
Sleep(100);
if Terminated then break;
if now>=EndTime then ShowMessage("EndTime"); //здесь выполнить то, что тебе нужно.
end;


 
iNew ©   (2003-08-20 12:39) [7]

> Panov
А почему просто не сделать

while not Terminated do
begin
Sleep(10 мин);
DoSomething;
end;

?


 
panov ©   (2003-08-20 12:43) [8]

>iNew © (20.08.03 12:39) [7]
А почему просто не сделать

А что будет, если тебе захочется во время ожидания завершить поток?
Например, выполнить метод MyThread.Terminate?

Придется для корректного завершения потока ждать 10 минут.


 
iNew ©   (2003-08-20 13:15) [9]

Тогда наверно надо сделать так:
FTimeOut: Integer;
EndTime: TDateTime;
begin
FTimeOut := 1; //минута для примера
EndTime := now + (1/24/60)* FTimeOut;
while not Terminated do
begin
Sleep(100);
if Terminated then break;
if now>=EndTime then
begin
DoSomething;
EndTime := now + (1/24/60)* FTimeOut;
end;
end

Мне ведь нужно чтоб DoSomething работало каждые 10 мин в теч-е всего дня.


 
Anatoly Podgoretsky ©   (2003-08-20 13:23) [10]

Тогда надо использовать таймер ли на десять минут, если требуется же6сткое повторение или перезапускать его после окончания операции, если требуется пауза между интервалами в 10 минут.


 
iNew ©   (2003-08-20 13:40) [11]

А вариант EndTime := now + (1/24/60)* FTimeOut;
чем плох?


 
Anatoly Podgoretsky ©   (2003-08-20 13:50) [12]

iNew © (20.08.03 13:40) [11]
Неплох, но другой и лишняя нагрузка на систему


 
panov ©   (2003-08-20 14:18) [13]

>Anatoly Podgoretsky © (20.08.03 13:50) [12]

Загрузка процессора минимальная в таком цикле.


 
Anatoly Podgoretsky ©   (2003-08-20 14:30) [14]

Но больше по сравнению с таймером, минимальная когда Sleep(10 мин);



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.014 c
3-10614
valeriy
2003-08-13 15:14
2003.09.04
клик по заголовку столбца таблицы


1-10733
Miralex
2003-08-20 10:27
2003.09.04
События OnEdit OnClick и OnDragOver


3-10547
Lapin
2003-08-12 10:31
2003.09.04
Operation not applicable


1-10720
iNew
2003-08-20 05:18
2003.09.04
Копирование файлов


3-10577
Cranium
2003-08-14 16:01
2003.09.04
Запрет перетаскивания столбца в гриде?




   Наверх