![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Точный таймер (1-2 мсек) [D6, Win2k]
mmb © (2002-08-16 12:16:00)Как как вызывать необходимую функцию с интервалом 10+-1 мсек?
mmb (2002-08-23 12:13:00) [1]не подкинет ли кто примерчик работы с PerformanceCounter ?
mmb (2002-08-22 18:19:00) [2]У меня W2k, может в нём дело ? :(
MBo (2002-08-22 13:15:00) [3]>mmb
у меня такой же точно, Вин98, все работает
mmb (2002-08-22 13:02:00) [4]Может причина в чём другом, а такое железо жаль выкидывать :
Pentium III-600
слон (2002-08-22 09:55:00) [5]TO MMB
Если у тебя PerformanceCounter не поддерживается, то выкинь нахрен такое железо, у меня и Пень 120Mhz его держал
mmb (2002-08-21 18:19:00) [6]С QueryPerformanceCounter ничего не получится, у меня похоже вот этот случай - возвращает 0
If the installed hardware does not support a high-resolution performance counter,
the return value is zero.
MBo (2002-08-21 14:15:00) [7]>sudiv
измерить можно, инициировать действия через точные промежутки времени нельзя
sudiv (2002-08-21 14:07:00) [8]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 или
выше.
Слесарь Матерящийся (2002-08-21 13:54:00) [9]По поводу измерений -- используйте OutputDebugString() + утилиту DbgView. Показывает время прихода сообщений с отличной точностью.
MBo (2002-08-21 12:33:00) [10]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
mmb (2002-08-21 12:05:00) [11]по моему :
10 срабатываний за 100 мсек
и
11 срабатываний за 120 мсек
Anatoly Podgoretsky (2002-08-21 12:04:00) [12]Вот это
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 20,
10 срабатываний за 10 мсек
mmb (2002-08-21 11:58:00) [13]что ты подразумеваешь под "количество срабатываний"
Anatoly Podgoretsky (2002-08-21 11:48:00) [14]Ты не верно меряешь, это опирается на системном времени, которое кратно 10 или 55 мсек. судя по всему у тебя за 10 мсек (от 10 до 20) таймер сработал 10 раз, попробуй поделить интервал на количество срабатываний
mmb (2002-08-21 11:38:00) [15]Меряю я так :
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 раза на третий отвечает :(
MBo (2002-08-21 09:52:00) [16]>Ketmar
realtime крутовато будет ;)), а above_normal существенно не влияет
Ketmar (2002-08-21 09:43:00) [17]а вы поднимите своей задаче приоритет до realtime, и основному потоку такой же назначьте. вот винда-то обрадуется :-) есть шанс, что будет нормальный таймер. правда, есть также шанс, что даже своп не сможет работать :-))
Satanas Nobiscum! 21-Aug-XXXVII A.S.
MBo (2002-08-21 06:25:00) [18]как измерено?
типичные времена у меня (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;
mmb (2002-08-20 19:44:00) [19]timeSetEvent заказано 10 мсек работает так
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 20, 0, ... :)
Andrew_R (2002-08-19 22:23:00) [20]На terry.net есть компонент TThiredTimer, по моему, очень хороший. И в 98/ME точность хорошая.