Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.095 c
15-1208711350
Andy BitOff
2008-04-20 21:09
2008.06.01
Высказывания знаменитых людей


2-1210653845
rom-off
2008-05-13 08:44
2008.06.01
Delphi


15-1208269646
MSSQL2005
2008-04-15 18:27
2008.06.01
Сервер не видит ленту


2-1210153969
Alex7
2008-05-07 13:52
2008.06.01
Флаговый параметр для CommandText ADODataSet к MS SQL


15-1208520113
Xerox Phaser 3210
2008-04-18 16:01
2008.06.01
Медленная печать фотографий на Xerox Phaser 3210





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский