Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.032 c
3-1092391743
Aleksandr.
2004-08-13 14:09
2004.09.12
Как обратиться к Default ADOConnection?


3-1092375996
tERRORist
2004-08-13 09:46
2004.09.12
DefaultExpression в ADODataSet


1-1093422135
Borion
2004-08-25 12:22
2004.09.12
Программная смена размера бумаги


14-1093485199
Думкин
2004-08-26 05:53
2004.09.12
С днем рождения! 26 августа


1-1093502707
Ven
2004-08-26 10:45
2004.09.12
DDE или OLE?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский