Пример объекта "ГЛАВНЫЕ ЧАСЫ СИСТЕМЫ"

Подобная структура, написанная для Delphi используется в редакторе swe



unit UClock;

(*====================================
  Главные часы системы - инициатор
  событий, к-рые происходят сами по себе,
  независимо от пользователя.

  Собственно таймер находится на главной форме.
  Это должен быть любой мультимедийный таймер с точностью 1мс

  Для каждого события, зависящего от времени в системе
  заводится свой объект, хранящий инетрвал события,
  время очередного срабатывания и адрес функции обработки

  ЕДИНИЦЫ ИЗМЕРЕНИЯ - 4-Х БАЙТОВЫЕ ЦЕЛЫЕ, 
  содержащие время в миллисекундах
=======================================*)

interface

uses Graphics,Windows,SysUtils;

Type
  TProc = procedure();

  TTimeSup = object
    gap  : integer; (* интервал события        *)
    time : DWORD;   (* очередное время события *)
    proc : TProc;
procedure Init(gap0:DWORD;proc0:TProc);
procedure Reset(gap0:DWORD;proc0:TProc);
procedure AlArm(gap0:DWORD);
procedure Serv(T:DWORD);
  end;

var
  tmCaret : TTimeSup;
  tmKeyb  : TTimeSup;

procedure MainTimeSupport;   (* рабочий цикл   *)
procedure WipeOn;            (* Поехали!       *)
procedure BusStop;           (* всё остановить *)

procedure ProcKeyb;
procedure ProcDummy;

implementation

uses
//  UCaret,  (* объект, управляющий курсором *)
    UKb,     (* объект, управляющий клавиатурой *)   
//  UMon,    (* монитор - управляет выполнением потока команд *)
//  UMain    (* главная форма программы *)
;


(*================================================*)
(*           TTimeSup                             *)
(*================================================*)

procedure TTimeSup.AlArm(gap0:DWORD);            (* переустановить "будильник" *)
begin
  gap := gap0; time := swTime + gap;
end;

procedure TTimeSup.Reset(gap0:DWORD;proc0:TProc);(* ... + сменить ф-ию *)
begin
  proc := proc0; gap := gap0; time := swTime + gap;
end;

procedure TTimeSup.Init(gap0:DWORD;proc0:TProc);(* ... + выполнить proc при        *)
begin                                           (* первом же страбатывании таймера *)        
  proc := proc0; gap := gap0; time := 0; 
end;

procedure TTimeSup.Serv(T:DWORD);               (* караулим событие *)
begin
  if T < time then Exit;    (* время не пришло *)
  proc;             (* выполнить действие      *)
  time := T + gap;  (* переставить "будильник" *)
end;



(*===================================================*)
(*  Двигатель системы (подключается к 1-мс таймеру)  *)
(*===================================================*)

procedure MainTimeSupport;
var T : DWORD;
begin
  T := mmSystem.timeGetTime;
  tmCaret.Serv(T);
  tmKeyb.Serv(T);
  (* .... other users subsystems ...... *)
end;


(*=========================================*)
(*     Пустая процедура                    *)
(*=========================================*)

procedure ProcDummy;
begin
end;


(*=====================================================*)
(* подсистема для управления стробированием клавиатуры *)
(*=====================================================*)

procedure ProcKeyb; (* 4 мс *)
begin
  if Keyb.LastKey <> 0 then begin
//  if Monitor.QActive then Exit; (* выйти, если выполняются другие команды *)
    Keyb.StrobStep;               (* Выполняем вычитание счётчика стробирования *)
    aForm.OnceMoreKeyDown;        (* в эту процедуру надо поместить всю
                                     содержательную часть события
                                     OnKeyDown главной формы программы *)
  end;
 end;
end;

(*==========================================*)
(* подсистема управляющая мерцанием курсора *)
(*==========================================*)

procedure ProcCaret; (* 350 мс *)  
begin
  (* .............. *)
end;


(*=========================================*)
(*=========================================*)
(*   Процедуры запуска и остановки служб   *)
(*=========================================*)
(*=========================================*)

procedure WipeOn;   (* Поехали - старт всех систем *)
begin
  tmCaret.Init(350,ProcCaret);
  tmKeyb.Init (4,ProcKeyb);
  aForm.ThdTimer1.Enabled := true;  (* запускаем 1-миллисекундный таймер *)
end;

procedure BusStop;  (* Всё остановить *)
begin
  tmKeyb.Init (4,ProcDummy);
  tmCaret.Init(350,ProcDummy);
  aForm.ThdTimer1.Enabled := false; (* останавливаем быстрый таймер *)
end;

(*=========================================*)

begin        (* инициализирующий код Unit'а *)

  BusStop;

end.


Вернуться к теме программное стробирование
Вернуться к теме проект редактора SWE

(с) Можаровский С.Г. // mailto:mozharovskys@mail.ru // swHome page