![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Время (высокоточное)
Чегермек © (2002-11-30 20:55:00)Знает ли кто-нить, как померить интервалы времени с точностью до десятков мкс?
MBo (2002-12-02 13:40:00) [21]>Igor1984
Может, кто и гонит....
Вызвать событие через точный интервал времени - нельзя,
а точно измерить промежуток времени - МОЖНО
Igor1984 (2002-12-02 13:33:00) [22]Да вы гоните. Минимальный шаг таймера ibm совместимых машин 55 мс. Меньшие интервалы получить невозможно. Разве что прогнать цикл много раз в течении к примеру секунды и подсчитывать сколько раз произошла итерация, а пот посчитать среднее.
MBo (2002-12-02 13:14:00) [23]QueryPerformanceCounter (API функция) или RDTSC (ассемблерная команда)
jack128 (2002-12-02 09:45:00) [24]на сколько я знаю в win это не возможно
Чегермек (2002-12-02 09:11:00) [25]не мс, а мкс !!!
Ich Hasse (2002-11-30 21:13:00) [26]
//------------------------------------------------------------------
// Файл: sk_timer.pas
// Описание: Функции для работы с мультимедиа таймером
//------------------------------------------------------------------
unit sk_timer;
interface
uses mmSystem, Windows, SysUtils, sk_const;
type
mmTimer = object
constructor Create(skDelay:Cardinal);
destructor Destroy;
procedure SetDelay(skDelay:Cardinal);
private
TimerID : Cardinal;
mmDelay : Cardinal;
end;
implementation
procedure Timer(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD) stdcall;
begin
//тут надо вставить код отсчета
end;
constructor mmTimer.Create(skDelay:Cardinal);
begin
TimerID:=timeSetEvent(skDelay,0,@Timer,0,TIME_PERIODIC);
if TimerID=0 then sle("Ошибка создания таймера");
mmDelay:=skDelay;
end;
destructor mmTimer.Destroy;
begin
if timeKillEvent(TimerID)=MMSYSERR_INVALPARAM then sle("Таймер не существует");
end;
procedure mmTimer.SetDelay(skDelay:Cardinal);
begin
if timeKillEvent(TimerID)=MMSYSERR_INVALPARAM then sle("Таймер не существует");
TimerID:=timeSetEvent(skDelay,0,@Timer,0,TIME_PERIODIC);
if TimerID=0 then sle("Ошибка создания таймера");
mmDelay:=skDelay;
end;
end.
sle - процедура устанавливающая последнюю ошибку, в принципе не нужна...
Ich Hasse (2002-11-30 21:03:00) [27]в смысле поставить такой таймер, который мерил бы с точностью до мс? Если да то это элементарно...