Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
ВнизКопирование файлов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c