Новые сообщения · Правила  
  • Страница 1 из 1
  • 1
Модератор форума: Berestovskiy  
Системный таймер
Доброго времени суток!!! Нужна помощь в решении вот такой задачи:
Разработать и реализовать в оо-классе интерфейс таймерного сервиса на основе Win32 функций QueryPerformanceCounter() и QueryPerformanceFrequency(). Интерфейс должен включать объявления методов для задания интервала срабатывания таймера (мс.), времени работы (мс.) и события на срабатывание.
Буду благодарна за комментарии к коду....Спасибо!
1 | Автор: Fonochka | 2010-11-30, 16:28   |  Репутация: [ + 0 ]
Code
unit HRTimer;

interface

uses Windows;

type
   // описание класса
   THRTimer = class(TObject)
     constructor Create;
     function StartTimer: Boolean; // функция старта/обнуление атймера
     function ReadTimer: Double;   // чтение времени работы таймера, начиная с его обнуления
   private
     StartTime: Double;
     ClockRate: Double;
   public
     Exists: Boolean;     
   end;

var
   Timer: THRTimer;   

{  
    function HRDelay(const Milliseconds: Double): Double;
    Milliseconds: Double - задержка в миллисекундах (может быть дробной)
    Результат функции - фактически произошедшая задержка с погрешностью.
    Пример вызова функции: X:= HRDelay(100.0); или HRDelay(100.0);
  }
function HRDelay(const Milliseconds: Double): Double;
   
implementation
   
function HRDelay(const Milliseconds: Double): Double;
begin
   Timer.StartTimer();
   repeat
     Result:= Timer.ReadTimer();
   until Result >= Milliseconds;
end;


If you can't make it GOOD make it LOOK GOOD. B.Gates
2 | Автор: DoVe | 2010-12-03, 21:38   |  Репутация: [ + 48 ]
продолжение юнита, всё в одном должно быть
Code
{ THRTimer }
   
constructor THRTimer.Create;
var
   QW: LARGE_INTEGER;
begin
   inherited Create;
   Exists := QueryPerformanceFrequency(Int64(QW));
   ClockRate := QW.QuadPart;
end;
   
function THRTimer.StartTimer: Boolean;
var
   QW: LARGE_INTEGER;
begin
   Result := QueryPerformanceCounter(Int64(QW));
   StartTime := QW.QuadPart;
end;
   
function THRTimer.ReadTimer: Double;
var
   ET: LARGE_INTEGER;
begin
   QueryPerformanceCounter(Int64(ET));
   Result := 1000.0 * (ET.QuadPart - StartTime) / ClockRate;
end;
   
initialization
   Timer:= THRTimer.Create();
   
finalization
   Timer.Free();
   
end.

юзать надо так:
HRT := THRTimer.Create - создание таймера
HRT.StartTimer - обноленин таймера в ноль
HRT.ReadTimer - возвращает отсчитанное время с момента обнуления таймера в миллисекунд.

это немного доработанный пример, один з которых можно найти даже в инете, использовал для замера работы сложных и ресурсоёмких процедур. вполне нормально работает.


If you can't make it GOOD make it LOOK GOOD. B.Gates
3 | Автор: DoVe | 2010-12-03, 21:39   |  Репутация: [ + 48 ]


If you can't make it GOOD make it LOOK GOOD. B.Gates
3 | Автор: DoVe | 2010-12-03, 21:39   |  Репутация: [ + 48 ]
А ты не мог бы проект сюда скинуть?
Спасибо...

Добавлено (19.12.10, 12:31)
---------------------------------------------
Необходимо разработать и реализовать в оо-классе интерфейс, т.е. использовать понятие интерфейса interface (нет в работе) и затем его реализовать (есть).

type
IHRTimer = interface
['{87ED4E58-83C0-40D2-9D56-3095B5F738E2}']
function StartTimer: Boolean;
function ReadTimer: Double;
procedure SetPeriod();
procedure SetInterval();
end;

THRTimer = class(IHRTimer, TInterfacedObject)
...

Также реализовать методы задания периода и интервала срабатывания, ввести событие пользователя на "тик".

4 | Автор: Fonochka | 2010-12-19, 12:31   |  Репутация: [ + 0 ]
  • Страница 1 из 1
  • 1
Поиск: