![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Цифры во время выполнения [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 обработать все сообщения, затем передаёт контроль твоему приложению.
Вот сказал ты прогрессбару перерисоваться(послал Винде сообщение - перерисуй прогрессбар), он бы и рад, да Винда твоим копированием файлов занята.