Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.01;
Скачать: CL | DM;

Вниз

Компьютерные мощи   Найти похожие ветки 

 
Alexander   (2008-04-30 19:42) [0]

Вопрос такой:
Если я создам таймер и напишу что-нибудь типа:
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 выполнений моего кода в секунду.
Итак, собственно вопрос:
Как заставить код выполняться с максимальным количеством действий в секунду (это должно зависеть от частоты процессора)?


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


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


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


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


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


 
Palladin ©   (2008-04-30 19:51) [2]

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


 
Palladin ©   (2008-04-30 19:53) [3]


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

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


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


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


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


 
Loginov Dmitry ©   (2008-04-30 19:54) [5]

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


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


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


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


Угу)

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


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


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

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


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


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


Как зачем ?)

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

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


 
Anatoly Podgoretsky ©   (2008-04-30 22:01) [9]


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

while true do
  ...
end;


 
Palladin ©   (2008-04-30 22:09) [10]

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

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


 
Anatoly Podgoretsky ©   (2008-04-30 23:09) [11]

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

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


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

> Alexander   (30.04.08 19:42)  

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

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

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

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

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

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


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


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

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

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

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

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

> while true do
>   ...
> end;

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


 
Loginov Dmitry ©   (2008-05-04 15:32) [14]


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


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

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

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


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


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


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


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


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

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.06.01;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
4-1190096968
roughneck
2007-09-18 10:29
2008.06.01
Как определить букву диска флешки?


15-1207051996
Ega23
2008-04-01 16:13
2008.06.01
Теперь уже без дураков - ММП 11.04 ?


15-1208483714
Slider007
2008-04-18 05:55
2008.06.01
С днем рождения ! 18 апреля 2008 пятница


15-1208288161
ProgRAMmer Dimonych
2008-04-15 23:36
2008.06.01
Книги по поиску и индексации


15-1208427995
@!!ex
2008-04-17 14:26
2008.06.01
Обновлений картинки на рабочем столе.