Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Цифры во время выполнения [D7, Win95/98, WinME, NT4, Win2k, WinXP]


ShimON ©   (2004-08-24 23:08:00) 

Привет мастерам!!!! Есть такой трабл. У меня в проге есть такой момент, когда с диска копируется куча файлов. В этот момент я хотел бы сделать либо прогресс бар лиьо просто цифорки показывать скока сделано. Вроде код написал, но во время самой процедуры копирования ничего не показывается, в конце только конечный результат выводится. Что сделать, чтобы избежать этот тормоз??? Зарание спасибо...


ShimON   (2004-08-25 14:30:00) [1]

Спасибо огромное!!! Помогло!!!!!


Digitman   (2004-08-25 14:13:00) [2]


> как только вставил значительно замедлился, вот поэтому думаю,
> что потоки помогут, разве нет??


нет

не помогут потоки

если тебе нужно только поелозить движком прогресс-бара, то ощутимо эффективней будет след.код :

for i:= ... to ... do
begin

 //обрабатываем очер.файл

 with ProgressBar do
 begin
   StepIt;
   Update;
 end;

end;


ShimON   (2004-08-25 13:32:00) [3]

Дело в том, что пока я не вставил строчки Application.ProcessMessages; у меня процесс копирования шёл достаточно быстро, а как только вставил значительно замедлился, вот поэтому думаю, что потоки помогут, разве нет??


Digitman   (2004-08-25 13:16:00) [4]


> Чтобы копирование шло своим чередом (быстро)


еще раз повторяю - оттого что копирование ты перенесешь из осн.трэда в дополнительный, быстрее оно от этого работать не станет


> параллельно посылало сигнал в форму о смене позиции прогресс
> бара


изменение св-ва progressbar1.position и есть "сигнал"
чем тебя такой простой вариант не устраивает ?


ShimON   (2004-08-25 13:03:00) [5]

Так мне же это и надо!!! Чтобы копирование шло своим чередом (быстро) и параллельно посылало сигнал в форму о смене позиции прогресс бара!!??
Напишите плиз простейший примерчик работы с потоками. Спасибо!


Digitman   (2004-08-25 12:54:00) [6]


> подумал потоками воспользоваться


плохо подумал

потоки не дадут никакого выигрыша в производительности твоего алгоритма, потоки лишь распараллеливают вычисления


3APA3A   (2004-08-25 12:51:00) [7]

Если через 2 раза - замени "if i mod 100 = 0" на "if Odd(i)"

 А потоками -
 пишешь поток, который копирует файлы и через каждый скопрированный 1 Мб (допустим) посылает сообщение окну с прогрессбаром изменить Position.


ShimON   (2004-08-25 12:41:00) [8]

Нет, такой способ мне не очень подходит, тк количество файлов постоянно разное. Может быть 10, а может быть 100, так что мне надо хотябы через 2 раза показывать, но тогда, когда 100 файлов тормозит немного.
Я подумал потоками воспользоваться, но не знаю как, может кто поможет??


TUser   (2004-08-25 07:07:00) [9]


> Да, заработать то заработало, вот только скорость добавления
> резко упала, мож знаешь что можно сделать???

Рисоание занимает много времени.
for i:=0 to ... do begin
if i mod 100 = 0 then begin
progressbar1.position:=(i*100) div ...;
Application.ProcessMessages;
end;
{}
end;


3APA3A   (2004-08-25 00:27:00) [10]

Хм... Механизм кеширования файлов, находящихся на дискете - это одно. Файлов с HDD/CDROM/NET - это другое.
А если он будет копировать пару гигабайт с винта на винт - куда по твоему они кешироваться будут?


Andy BitOff   (2004-08-25 00:21:00) [11]


ShimON   (25.08.04 00:04) [6]
А ты не знаешь почему копирование таким методом первый раз идет медленно а второй быстро??


А потому, что кэшируются они.
Ты попробуй с дискеты файлик скопировать сначала в один каталог, а потом в другой, так второй раз и чтения с дискеты не будет.


3APA3A   (2004-08-25 00:13:00) [12]

Что то мне не верится, что ProcessMessage сильно затормаживает программу...


ShimON   (2004-08-25 00:11:00) [13]

Причём, даже после перезапуска самой программы запись тех же файлов занимает намного меньше времени причём в разы!!!!


ShimON   (2004-08-25 00:04:00) [14]

А ты не знаешь почему копирование таким методом первый раз идет медленно а второй быстро??


Алхимик   (2004-08-24 23:55:00) [15]

Например Application.ProcessMessage через раз вставлять.
В [3]
for i := 0 to <много файлов> do begin
 <копируем файлик кудато там>;
 <дёргаем прогрессбар>;
 if odd(i) then
 Application.ProcessMessage;// говорим винде, чтобы занялась
                            // дёрганьем прогрессбара
end;


ShimON   (2004-08-24 23:50:00) [16]

Да, заработать то заработало, вот только скорость добавления резко упала, мож знаешь что можно сделать???


Алхимик   (2004-08-24 23:47:00) [17]

var
i : integer;

...
for i := 0 to <много файлов> do begin
  <копируем файлик кудато там>;
  <дёргаем прогрессбар>;
  Application.ProcessMessage;// говорим винде, чтобы занялась
                             // дёрганьем прогрессбара
end;


ShimON   (2004-08-24 23:44:00) [18]

Так заработает это или нет. Ди и как вернуть винде право делать дальше свое дело??


Алхимик   (2004-08-24 23:42:00) [19]

Application.ProcessMessage + F1
Заставляет WIN обработать все сообщения, затем передаёт контроль твоему приложению.

Вот сказал ты прогрессбару перерисоваться(послал Винде сообщение - перерисуй прогрессбар), он бы и рад, да Винда твоим копированием файлов занята.


Наверх

Титульная страница Поиск, карта сайта Написать письмо