Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.04;
Скачать: 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 вся ветка

Текущий архив: 2003.09.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
14-10965
Soft
2003-08-15 17:33
2003.09.04
Российский процессор Эльбрус может стать конкурентом Itanium


14-10952
Ig
2003-08-13 20:36
2003.09.04
Ни кто не встречал компонент для Delphi


14-10882
Marser
2003-08-13 23:47
2003.09.04
Реформы, как подмога флудеру


14-10944
malkolinge
2003-08-14 19:32
2003.09.04
А кто такой деятель с ником имя(красного цвета перечеркнутый)


1-10778
Spawn
2003-08-23 09:19
2003.09.04
Word