Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Цифры во время выполнения   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
14-1093001164
Грибоедов
2004-08-20 15:26
2004.09.12
Delphi 8. Начало конца.


1-1093344430
Sourse
2004-08-24 14:47
2004.09.12
Как отследить обращение к реестру?


3-1092818029
Stasde
2004-08-18 12:33
2004.09.12
Нужна разная высота для разных панелей в TCtrlDBGrid.


4-1089994930
Ded Moroz
2004-07-16 20:22
2004.09.12
проблемы с RAS


14-1093507145
Baks
2004-08-26 11:59
2004.09.12
Мастера подскажите