Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Application.ProcessMessages


Автор: sgentstuff 15.7.2006, 13:22
сильно ли эта штука тормозит цикл?
Код

Application.ProcessMessages;
 

Автор: DemoCode 15.7.2006, 13:37
Цитата(sgentstuff @  15.7.2006,  14:22 Найти цитируемый пост)
сильно ли эта штука тормозит цикл?

Зависит от многих обстоятельств. А опытным путем нельзя проверить? 

Автор: Palladin 15.7.2006, 13:38
Да, это происходит потому что даже если ты используеш только одну подкоманду
допустим Application.ProcessMessages;
Помимо неё подгружается ВЕСЬ TApplication, а он состоит из сотен строк кодаsmile 

Автор: sgentstuff 15.7.2006, 13:45
ну помимо того что просто как команда тормозит, еще добавляется тормознутость (т.е я делаю люболе действие прерывается цикл совершается действие и потом он дальше продолжается, сильно ли это тормозит?), опытным не знаю как проверить 

Автор: BUGOR 15.7.2006, 13:54
Цитата

опытным не знаю как проверить


Замерить время выполнения с этой командой и без неё, отнять от первого второе. 

Автор: Alexeis 15.7.2006, 15:40
sgentstuff, эта команда заставляет обработать все поступившие сообщения и если код обработчика быдет выполнятся секунду, то вся программа в это время будет ждать т.е. все зависит от длительности выполнения кода обработчика. Если это время велико, то обычно создают второй поток и помещают то что должно выполнятся постоянно в него, а обработчики будут выполнятся паралельно с ним. 

Автор: Voyager 15.7.2006, 18:01
Если в цикле обарабтывается достаточно много элементов, то да, заметно тормозит. 

Автор: SoWa 15.7.2006, 21:12
Чтобы измерить время делай gettickcount до и после работы. Потом вычитай.
Код

var i,j: cardinal {если не ошибаюсь}
begin
i:=gettickcount;
{Тут всякий код}
j=gettickcount;

result=abs(j-i);
end;
 

Автор: sgentstuff 16.7.2006, 07:41
В общем затестил я это дело, если во время работы программы ничего не делать то время работы одинаково, если же че-то делать с формочкой(например перетаскивать), то время работы заметно увеличивается, короче все понятно, всем спасибо!

Добавлено @ 07:47 
Цитата(SoWa @ 15.7.2006,  21:12)
Чтобы измерить время делай gettickcount до и после работы. Потом вычитай.
Код

var i,j: cardinal {если не ошибаюсь}
begin
i:=gettickcount;
{Тут всякий код}
j=gettickcount;

result=abs(j-i);
end;

i:=gettickcount; - это просто число, как его в нормальное время преобразовать?

Добавлено @ 07:51 
Цитата(alexeis1 @ 15.7.2006,  15:40)
sgentstuff, эта команда заставляет обработать все поступившие сообщения и если код обработчика быдет выполнятся секунду, то вся программа в это время будет ждать т.е. все зависит от длительности выполнения кода обработчика. Если это время велико, то обычно создают второй поток и помещают то что должно выполнятся постоянно в него, а обработчики будут выполнятся паралельно с ним.

код обработчика будет выполнятся секунду - отчего зависит время выполнения кода обработчика, т.е если я например нажал на формочку и таскаю ее по экрану, вся программа ждет пока я ее отпущу? 

Автор: Palladin 16.7.2006, 12:15
Цитата(sgentstuff @  16.7.2006,  07:41 Найти цитируемый пост)

код обработчика будет выполнятся секунду - отчего зависит время выполнения кода обработчика, т.е если я например нажал на формочку и таскаю ее по экрану, вся программа ждет пока я ее отпущу? 



Да, хочеш живой пример в Windows smile  вообщем начни чтонить качать по сети себе на камп, после того как начнётся скачка(качать только нужно стандартно, без каких-либо программ) возьми окно которое показывает сколько скачалось и потаскай его по рабочему столу, скачка на время перетаскивания замирает smile 

P.S. Покрайней мере у меня на кампе так smile  

Автор: BUGOR 16.7.2006, 12:44
RooR, скачка идёт параллельно, просто инфа не отображается.

Цитата

i:=gettickcount; - это просто число, как его в нормальное время преобразовать?


Это не просто число, это кол-во миллисекунд с момента последней перезагрузки. Как перевести? Простым делением сначала на 1000(получишь кол-во секунд), потом на 60(минуты) и ещё раз на 60(часы), ну можно ещё на 24, тогда сутки, а потом ещё на 365, это уже года, ну и ещё на 100, векаsmile 

Автор: Palladin 16.7.2006, 12:48
Цитата(BUGOR @  16.7.2006,  12:44 Найти цитируемый пост)
RooR, скачка идёт параллельно, просто инфа не отображается.


Хмм возможно smile ну дак влюбом случаее виден замороз, что пока перетаскиваеш идёт ожиданиеsmile в данном случае анимашки скачки smile 

P.S. 2Bugor то что ты сказал это точно?????
 

Автор: BUGOR 16.7.2006, 13:01
RooR, ну проверь, это же не сложно сделать. Поперетаскивай окошко секунд десять, потом отпусти и на прогрессбаре будет скачок, это говорит о том, что во время перетаскивание скачивание файла продолжалось.  

Автор: Palladin 16.7.2006, 13:13
2Bugor Гениально smile  smile  smile  за мегамозг получай по репе "+" smile 

P.S. Я так и проверил ещё до того как ты отписал свой последний пост smile 
 

Автор: Mr.Floppy 16.7.2006, 13:33
Цитата
сильно ли эта штука тормозит цикл?

Сильно. Поэтому, если ты делаешь какие-то долгие вычисление в цикле, и рисуешь прогрессбар или изменяешь текст кепшена, то делай это не чаще 1 раза в секунду. (кстати, TGauge сам перерисовывается и ему не надо ProcessMessages выполнять) 

Автор: Mechanic 16.7.2006, 21:23
Время отбирает даже при пустой очереди сообщений. Ну, а ежели еще и баттоны на форме давить, ресайзить и мувить её по-ходу... Тут нужно определиться, что важнее, скорость работы цикла, или же скорость реакции интерфейса, и сделать необходимый компромис. Если очень большие вычисления, но важна и скорость отклика интерфейса, то доп. поток покрасивше будет.
Хотя, нужно ещё задачу рассмотреть. Может быть просто правильно события и их обработчики распланировать, и всё нормально разместится в одном потоке без тормозов.

Цитата(BUGOR @  16.7.2006,  12:44 Найти цитируемый пост)
Это не просто число, это кол-во миллисекунд с момента последней перезагрузки. Как перевести? Простым делением сначала на 1000(получишь кол-во секунд), потом на 60(минуты) и ещё раз на 60(часы), ну можно ещё на 24, тогда сутки, а потом ещё на 365, это уже года, ну и ещё на 100, века  


Ну, на 365 уже делить не придется, т.к. GetTickCount возвращает dword, и разрядности его хватает что-то около 50 суток, если не ошибаюсь.  smile 
Хотя слыхал, что есть и 64-битная версия GetTickCount. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)