Пример объекта "ГЛАВНЫЕ ЧАСЫ СИСТЕМЫ"
Подобная структура, написанная для 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