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

Вниз

Точный таймер (1-2 мсек)   Найти похожие ветки 

 
mmb   (2002-08-16 12:16) [0]

Как как вызывать необходимую функцию с интервалом 10+-1 мсек?


 
MBo ©   (2002-08-16 12:52) [1]

timeSetEvent (mmsystem)


 
mmb   (2002-08-16 19:16) [2]

К большому сожалению её точность проверенная экспериментально равна +-10-15 мсек


 
MBo ©   (2002-08-16 20:19) [3]

c SetTimer не спутали? У него действительно десятки мс разброс.
У timeSetEvent точность повыше, но абсолютной в Windows добиться невозможно.


 
Andrew_R   (2002-08-19 22:23) [4]

На terry.net есть компонент TThiredTimer, по моему, очень хороший. И в 98/ME точность хорошая.


 
mmb   (2002-08-20 19:44) [5]

timeSetEvent заказано 10 мсек работает так
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 20, 0, ... :)


 
MBo ©   (2002-08-21 06:25) [6]

как измерено?
типичные времена у меня (D5,W98)

Min:9.94 Max:11.81 Mean:10.00 StdDev:0.08
иногда самый первый интервал бывает побольше
Если окна таскать, сворачивать/разворачивать, разброс бывает от
7 до 14.


const
cmax = 500;

var
Form1: TForm1;
tim: cardinal;
T1, T2, Rate: Int64;
d: array of double;
cnt: integer;

implementation

{$R *.DFM}

procedure timecback(uID, uMsg, dwUser, dw1, dw2: cardinal); stdcall;
begin
inc(cnt);
QueryPerformanceCounter(T2);
d[cnt - 1] := 1000 * (t2 - t1) / rate;
t1 := t2;
if cnt >= cmax then
begin
timekillevent(tim);
form1.button2click(nil);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
QueryPerformanceFrequency(Rate);
SetLength(d, cmax);
cnt := 0;
QueryPerformanceCounter(T1);
tim := timesetevent(10, 0, timecback, 0, TIME_PERIODIC);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
mn, mx, meand, sdev: extended;
begin
if tim <> 0 then
timekillevent(tim);
if cnt <> cmax then
setlength(d, cnt);
for i := 0 to cnt - 1 do
memo1.lines.add(formatfloat("0.000", d[i]));
meanandstddev(d, meand, sdev);
mn := minvalue(d);
mx := maxvalue(d);
memo1.lines.add(format("Number of pts:%d", [cnt]));
memo1.lines.add(format("Min:%3.2f Max:%3.2f Mean:%3.2f StdDev:%3.2f", [mn, mx, meand, sdev]));
end;


 
Ketmar ©   (2002-08-21 09:43) [7]

а вы поднимите своей задаче приоритет до realtime, и основному потоку такой же назначьте. вот винда-то обрадуется :-) есть шанс, что будет нормальный таймер. правда, есть также шанс, что даже своп не сможет работать :-))

Satanas Nobiscum! 21-Aug-XXXVII A.S.


 
MBo ©   (2002-08-21 09:52) [8]

>Ketmar
realtime крутовато будет ;)), а above_normal существенно не влияет


 
mmb   (2002-08-21 11:38) [9]

Меряю я так :
void __stdcall MyTimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
DWORD dt = timeGetTime() - t;
Form1->Memo1->Lines->Add(IntToStr(dt));
t += dt;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
uTimerID = timeSetEvent(10, 0, MyTimeProc, 0, TIME_PERIODIC);
}
//---------------------------------------------------------------------------

Больше всего меня угнетает переодическое увеличение вдвое интервала - это приводит к пропускам и синхронизация модели на сервере и упр. программы на раб. станции совершенно сбивается. А если realtime поставить, то сервер по сети через 2 раза на третий отвечает :(


 
Anatoly Podgoretsky ©   (2002-08-21 11:48) [10]

Ты не верно меряешь, это опирается на системном времени, которое кратно 10 или 55 мсек. судя по всему у тебя за 10 мсек (от 10 до 20) таймер сработал 10 раз, попробуй поделить интервал на количество срабатываний


 
mmb   (2002-08-21 11:58) [11]

что ты подразумеваешь под "количество срабатываний"


 
Anatoly Podgoretsky ©   (2002-08-21 12:04) [12]

Вот это
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 20,

10 срабатываний за 10 мсек


 
mmb   (2002-08-21 12:05) [13]

по моему :
10 срабатываний за 100 мсек
и
11 срабатываний за 120 мсек


 
MBo ©   (2002-08-21 12:33) [14]

timeGetTime мерить плохо- ты используешь ту же точность, а надо что-то получше. поэтому я и применял QueryPerformanceCounter, вот типичная последовательность
9.987
10.000
10.002
9.994
10.029
9.970
9.996
10.004
9.998
9.993
10.011
9.985
10.006
9.993
10.014
9.998
9.984
10.003
9.993
9.999


 
Слесарь Матерящийся   (2002-08-21 13:54) [15]

По поводу измерений -- используйте OutputDebugString() + утилиту DbgView. Показывает время прихода сообщений с отличной точностью.


 
sudiv ©   (2002-08-21 14:07) [16]

to mmb (16.08.02 12:16)
А это не подойдёт ???

http://www.dbwork.kuban.ru/rus/comps.html


TVVMClock
Компонент позволяет с точностью до миллисекунды измерить время выполнения процесса, процедуры, функ-
ции. Достаточно установить компонент на форму и перед тестируемым участком кода вызвать метод Start, а
после вызвать метод Show. Удобен для отладки приложений критичных ко времени исполнения кода. Компонент
позволяет изменять способ отображения времени: секунды, миллисекунды или измерять количества тиков
процессора (RDTSC - Read Time Stamp Counter), при использовании процессоров Pentium, Celeron, AMD K6-2 или
выше.


 
MBo ©   (2002-08-21 14:15) [17]

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


 
mmb   (2002-08-21 18:19) [18]

С QueryPerformanceCounter ничего не получится, у меня похоже вот этот случай - возвращает 0

If the installed hardware does not support a high-resolution performance counter,
the return value is zero.


 
слон   (2002-08-22 09:55) [19]

TO MMB
Если у тебя PerformanceCounter не поддерживается, то выкинь нахрен такое железо, у меня и Пень 120Mhz его держал



 
mmb   (2002-08-22 13:02) [20]

Может причина в чём другом, а такое железо жаль выкидывать :
Pentium III-600


 
MBo ©   (2002-08-22 13:15) [21]

>mmb
у меня такой же точно, Вин98, все работает


 
mmb   (2002-08-22 18:19) [22]

У меня W2k, может в нём дело ? :(


 
mmb   (2002-08-23 12:13) [23]

не подкинет ли кто примерчик работы с PerformanceCounter ?



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

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

Наверх




Память: 0.52 MB
Время: 0.014 c
3-92387
Эрик
2002-10-08 12:31
2002.10.28
IBDataSet


1-92545
Cossys
2002-10-16 12:25
2002.10.28
Прорисовка итемов CheckListBox при заполнении


6-92626
Руль
2002-08-26 02:14
2002.10.28
Помогите загрузить страничку и сохранить только текст!!!!!


3-92336
BoxTer
2002-10-06 12:10
2002.10.28
Запрос к БД


3-92326
ec
2002-10-05 15:43
2002.10.28
Как послать параметр в StoredProc