Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизЦифры во время выполнения Найти похожие ветки
← →
ShimON (2004-08-24 23:08) [0]Привет мастерам!!!! Есть такой трабл. У меня в проге есть такой момент, когда с диска копируется куча файлов. В этот момент я хотел бы сделать либо прогресс бар лиьо просто цифорки показывать скока сделано. Вроде код написал, но во время самой процедуры копирования ничего не показывается, в конце только конечный результат выводится. Что сделать, чтобы избежать этот тормоз??? Зарание спасибо...
← →
Алхимик © (2004-08-24 23:42) [1]Application.ProcessMessage + F1
Заставляет WIN обработать все сообщения, затем передаёт контроль твоему приложению.
Вот сказал ты прогрессбару перерисоваться(послал Винде сообщение - перерисуй прогрессбар), он бы и рад, да Винда твоим копированием файлов занята.
← →
ShimON (2004-08-24 23:44) [2]Так заработает это или нет. Ди и как вернуть винде право делать дальше свое дело??
← →
Алхимик © (2004-08-24 23:47) [3]
var
i : integer;
...
for i := 0 to <много файлов> do begin
<копируем файлик кудато там>;
<дёргаем прогрессбар>;
Application.ProcessMessage;// говорим винде, чтобы занялась
// дёрганьем прогрессбара
end;
← →
ShimON (2004-08-24 23:50) [4]Да, заработать то заработало, вот только скорость добавления резко упала, мож знаешь что можно сделать???
← →
Алхимик © (2004-08-24 23:55) [5]Например Application.ProcessMessage через раз вставлять.
В [3]
for i := 0 to <много файлов> do begin
<копируем файлик кудато там>;
<дёргаем прогрессбар>;
if odd(i) then
Application.ProcessMessage;// говорим винде, чтобы занялась
// дёрганьем прогрессбара
end;
← →
ShimON (2004-08-25 00:04) [6]А ты не знаешь почему копирование таким методом первый раз идет медленно а второй быстро??
← →
ShimON (2004-08-25 00:11) [7]Причём, даже после перезапуска самой программы запись тех же файлов занимает намного меньше времени причём в разы!!!!
← →
3APA3A © (2004-08-25 00:13) [8]Что то мне не верится, что ProcessMessage сильно затормаживает программу...
← →
Andy BitOff © (2004-08-25 00:21) [9]
ShimON (25.08.04 00:04) [6]
А ты не знаешь почему копирование таким методом первый раз идет медленно а второй быстро??
А потому, что кэшируются они.
Ты попробуй с дискеты файлик скопировать сначала в один каталог, а потом в другой, так второй раз и чтения с дискеты не будет.
← →
3APA3A © (2004-08-25 00:27) [10]Хм... Механизм кеширования файлов, находящихся на дискете - это одно. Файлов с HDD/CDROM/NET - это другое.
А если он будет копировать пару гигабайт с винта на винт - куда по твоему они кешироваться будут?
← →
TUser © (2004-08-25 07:07) [11]
> Да, заработать то заработало, вот только скорость добавления
> резко упала, мож знаешь что можно сделать???
Рисоание занимает много времени.
for i:=0 to ... do begin
if i mod 100 = 0 then begin
progressbar1.position:=(i*100) div ...;
Application.ProcessMessages;
end;
{}
end;
← →
ShimON (2004-08-25 12:41) [12]Нет, такой способ мне не очень подходит, тк количество файлов постоянно разное. Может быть 10, а может быть 100, так что мне надо хотябы через 2 раза показывать, но тогда, когда 100 файлов тормозит немного.
Я подумал потоками воспользоваться, но не знаю как, может кто поможет??
← →
3APA3A © (2004-08-25 12:51) [13]Если через 2 раза - замени "if i mod 100 = 0" на "if Odd(i)"
А потоками -
пишешь поток, который копирует файлы и через каждый скопрированный 1 Мб (допустим) посылает сообщение окну с прогрессбаром изменить Position.
← →
Digitman © (2004-08-25 12:54) [14]
> подумал потоками воспользоваться
плохо подумал
потоки не дадут никакого выигрыша в производительности твоего алгоритма, потоки лишь распараллеливают вычисления
← →
ShimON (2004-08-25 13:03) [15]Так мне же это и надо!!! Чтобы копирование шло своим чередом (быстро) и параллельно посылало сигнал в форму о смене позиции прогресс бара!!??
Напишите плиз простейший примерчик работы с потоками. Спасибо!
← →
Digitman © (2004-08-25 13:16) [16]
> Чтобы копирование шло своим чередом (быстро)
еще раз повторяю - оттого что копирование ты перенесешь из осн.трэда в дополнительный, быстрее оно от этого работать не станет
> параллельно посылало сигнал в форму о смене позиции прогресс
> бара
изменение св-ва progressbar1.position и есть "сигнал"
чем тебя такой простой вариант не устраивает ?
← →
ShimON (2004-08-25 13:32) [17]Дело в том, что пока я не вставил строчки Application.ProcessMessages; у меня процесс копирования шёл достаточно быстро, а как только вставил значительно замедлился, вот поэтому думаю, что потоки помогут, разве нет??
← →
Digitman © (2004-08-25 14:13) [18]
> как только вставил значительно замедлился, вот поэтому думаю,
> что потоки помогут, разве нет??
нет
не помогут потоки
если тебе нужно только поелозить движком прогресс-бара, то ощутимо эффективней будет след.код :
for i:= ... to ... do
begin
//обрабатываем очер.файл
with ProgressBar do
begin
StepIt;
Update;
end;
end;
← →
ShimON (2004-08-25 14:30) [19]Спасибо огромное!!! Помогло!!!!!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.031 c