Форум: "Система";
Текущий архив: 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.49 MB
Время: 0.009 c