Форум: "Начинающим";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];
ВнизКомпьютерные мощи Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.065 c