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

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

Компьютерные мощи [D7, XP]


Alexander ©   (2008-04-30 19:42:00) 

Вопрос такой:
Если я создам таймер и напишу что-нибудь типа:
procedure TForm1.Timer1Timer(Sender: TObject);
var
 k: integer;
begin
 k := strtoint(label1.Caption);
 k := k + 1;
 label1.Caption := inttostr(k);
end;
то значение в label1 начнёт неограниченно увеличиваться
(label1.caption = 0), но скорость этого увеличения ограничена скоростью таймера, т.е. самое быстрое это 10 или 1 значение интервала (кстати, почему между этими значениями нет разницы?), т.е. это около 100 выполнений моего кода в секунду.
Итак, собственно вопрос:
Как заставить код выполняться с максимальным количеством действий в секунду (это должно зависеть от частоты процессора)?


Alexander   (2008-05-06 09:40:00) [1]


> Создай дополнительный поток TThread, и в нем примерно такой
> код:
>
> while not Terminated do
>  if WaitForSingleObject(TimerEvent, 1) = WAIT_TIMEOUT then
>    OnTimerEvent();
>
> это даст выигрыш по сравнению с виндовым таймером, но приведет
> к большей загрузке процессора.

Спасибо, бум разбираться)


> начало тела цикла
>  .. накручивание счетчика ..
>  Application.ProcessMessages; //вот она, "волшебная строка"
> конец тела цикла

Отлично!  То, что нужно) Спасибо большое.

Спасибо всем кто ответил.


Сергей М.   (2008-05-04 15:33:00) [2]


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


начало тела цикла
 .. накручивание счетчика ..
  Application.ProcessMessages;//вот она, "волшебная строка"
конец тела цикла


Loginov Dmitry   (2008-05-04 15:32:00) [3]


> Можно поподробнее?


Создай дополнительный поток TThread, и в нем примерно такой код:

while not Terminated do
 if WaitForSingleObject(TimerEvent, 1) = WAIT_TIMEOUT then
   OnTimerEvent();

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


Alexander   (2008-05-04 14:56:00) [4]


> Интервал таймера и не должен зависеть от мощности машины,
>  поэтому он задается в миллисекундах. Представь, что было
> бы, если, например, надо опрашивать датчики раз в секунду,
>  программист написал правильную программу, но у одного юзера
> датчики опрашиваются 5 раз в секунду, а у другого - раз
> в 5 секунд.

Это я понимаю, я имел ввиду, что если я выполняю какое-то действие (хотябы накручивание счётчика) и при этом я хочу видеть процесс этого самого накручивания, я использую Timer, если я использую цикл, то он сначала просчитается и выдаст ответ, а я хочу видеть изменения как в случае с таймером, но с таймер окраничен. Как мне сделать, чтобы накручивание счётчика происходило быстрее чем в случае с таймером (я не считаю, если брать не +1, а +10 или +100), я хочу, чтобы это действие происходило быстрее.

> интересно, а с какой целью тебе обновлять caption со скоростью
> более ста раз в секунду? :)

Это просто пример, для наглядности)
Насчёт аппаратуры и таймера я наверное неправильно выразился, понятно, что между таймером и процессором  нет прямой связи.
> Мультимедийный таймер (или Sleep() в доп. потоке).
> Быстрее и без извратов с ОС - никак.

Можно поподробнее?

> while true do
>   ...
> end;

:)
Прошу простить за невнятную постановку вопроса:)


Восхищенный   (2008-05-01 11:19:00) [5]

> Alexander   (30.04.08 19:42)  

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

> Как заставить код выполняться с максимальным количеством
> действий в секунду

Код и так выполняется с максимально возможной скоростью. Если нужно, чтобы он выполнялся долго, то надо поместить его в цикл.

> это должно зависеть от частоты процессора

Не только. Это зависит и от того, сколько и каких других программ запущено (и с каким приоритетом), сколько доступно памяти (и с  какой скоростью она работает), используется ли страничная память, (и с какой скоростью она работает), что это за код (и с каким приоритетом он работает) ... в общем, факторов много.

Максимальную скорость можно получить, если запусить код с Real-time приоритетом (см. SetPriorityClass и SetThreadPriority). Но проводить такие эксперименты не советую, работа системы может нарушиться. По крайней мере, сначала почитай в MSDN о приоритетах потоков и процессов.


Anatoly Podgoretsky   (2008-04-30 23:09:00) [6]

> Palladin  (30.04.2008 22:09:10)  [10]

Чему неокрепшую молодежь учишь.


Palladin   (2008-04-30 22:09:00) [7]

а мона еще хужее :)

Var
i:Integer;
c:^Integer;
Begin
c:=@i;
For i:=0 to 1 Do c^:=0;
End;


Anatoly Podgoretsky   (2008-04-30 22:01:00) [8]


> Как заставить код выполняться с максимальным количеством
> действий в секунду (это должно зависеть от частоты процессора)?
>

while true do
  ...
end;


Сергей М,   (2008-04-30 20:01:00) [9]


> Palladin ©   (30.04.08 20:00) [7]


Как зачем ?)

Александер вот не въезжает)

Ему вынь да положь килогерц или исключение)


Palladin   (2008-04-30 20:00:00) [10]


> Не возвращает, зараза, ошибки при вызове SetTimer с заведомо
> невыполнимыми требованиями )

а зачем? :) все сказано ясно, приду когда смогу или не приду, но не раньше таймаута! :)


Сергей М,   (2008-04-30 19:57:00) [11]


> Palladin ©   (30.04.08 19:53) [3]


Угу)

Не возвращает, зараза, ошибки при вызове SetTimer с заведомо невыполнимыми требованиями )


Сергей М,   (2008-04-30 19:54:00) [12]


> Palladin ©   (30.04.08 19:51) [2]


у его глаза нестандартные)


Loginov Dmitry   (2008-04-30 19:54:00) [13]

> Как заставить код выполняться с максимальным количеством
> действий в секунду


Мультимедийный таймер (или Sleep() в доп. потоке).
Быстрее и без извратов с ОС - никак.


Palladin   (2008-04-30 19:53:00) [14]


> Потому что так решил БГ.

Лидер группы Аквариум :))


Palladin   (2008-04-30 19:51:00) [15]

интересно, а с какой целью тебе обновлять caption со скоростью более ста раз в секунду? :)


Сергей М,   (2008-04-30 19:50:00) [16]


> это должно зависеть от частоты процессора


Не-а, не должно.
Между аппаратурой, используемой компонентом TTimer, и аппаратурой, имеющей отношение к процессору и его тактированию, нет прямой связи.


> почему между этими значениями нет разницы?


Потому что так решил БГ.


Наверх

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