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