Вниз
Скачать: 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.02 c
6-10848
leonidus
2003-06-29 00:38
2003.09.04
Странности работы NMHTTP


1-10703
Rav
2003-08-18 19:35
2003.09.04
Ms Excel


1-10798
dnv-nik
2003-08-22 10:41
2003.09.04
Потоки


14-10974
Marser
2003-08-18 01:18
2003.09.04
Именинники 18 августа


14-10874
Axis_of_Evil
2003-08-14 16:23
2003.09.04
---|Ветка была без названия|---




   Наверх