Delphi: TTimer (upd)

yolki

Срабатывает не быстрее 64 раз в секунду.
Interval = 1.
С чем связано и как можно получить хотя бы 200 раз в секунду?
На форме Timer (disabled) , Edit, Button..

procedure TForm1.Button1Click(Sender: TObject);
begin
TimeStart:=Time;
Timer1.Enabled := True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
inc(count);
Edit1.TexT:=Format('%5.3f',[count/(time-timestart)/60/60/24]);
end;

Dasar

Стандартный windows-овский timer (WM_TIMER) быстрее не умеет.
Создать доп. поток, из под которого и дергаться с нужным периодом.

Helga87

В DelphiX есть компонент "быстрый таймер".

rosali

По-моему лучше слать из того другого треда в основной message. Это так сказать стиль виндового мультитрединга, вся синхронизация унесена в ОС.

Dasar

да, можно и так - если позволяет задача.

yolki


unit Unit2;
interface
uses SysUtils, Classes;
type
TFastTimerProc = procedure of object;
TFastTimer = class(TThread)
protected
procedure Execute; override;
public
Interval : TDateTime;
OnTimer : TFastTimerProc;
end;
implementation
{ TFastTimer }
procedure TFastTimer.Execute;
var
LastExec : TDateTime;
begin
LastExec:=Time;
while not Terminated do
begin
if Time-LastExec>Interval then
begin
LastExec:=Time;
OnTimer;
end;
end;
end;
end.

Быстрее 64 не получилось. другие соображения?

yolki

подозреваю, это проблема в Time (GetTime).
Есть другие методы вычисления времени, с точностью до 1 мс (а не 15мс, как в случае Time)?

okunek

QueryPerformanceCounter
QueryPerformanceFrequency

maggi14

какая система? недавно targon жаловался, что в 9х таймер дискретно работает, а в НТ все нормально.

yolki

Freq: 3579545
Win2003/Win2000

yolki

О! Заработало. спасибо большое!

rosali

Лучше вообще-то ставить Sleep чем в активном цикле тут наворачивать...

yolki

Я одним местом чувствую, что в активном цикле - плохо, но объяснить, почему - не могу.
Можешь грамотно обосновать?

Dasar

Потому что ты ничего не делая, загружаешь при этом процессор на 100%

yolki

Прав. буду думать.
Sleep спит 1 мс => будет щёлкать 1000 раз.
Sleep спит 2 мс => будет щёлкать 500 раз.
Есть возможность щёлкать равномерно 700 раз в секунду не нагружая процессор на 100%?

Helga87

Можешь намекнуть, что за задача стоит перед тобой?

lesfleursbleues

микросекунду поспать на таймере, оставшееся время прокрутить в цикле - загрузка будет ~10%
ps
Во время прокрутки цикла можно делать Sleep(0) - если есть "горячий" поток, то управление будет передано ему
Оставить комментарий
Имя или ник:
Комментарий: