Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];

Вниз

Точный таймер (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.05 c
1-92598
I_S_
2002-10-17 10:47
2002.10.28
---|Ветка была без названия|---


1-92471
theEnter
2002-10-18 10:26
2002.10.28
DBGrid - несколько строк в заголовке


3-92387
Эрик
2002-10-08 12:31
2002.10.28
IBDataSet


1-92543
stainer
2002-10-16 10:21
2002.10.28
i/o error 123


14-92740
Mad_Ghost
2002-10-09 07:26
2002.10.28
структура из файла





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский