⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oop实现事件调度模型 (2001年2月14日).txt

📁 自己对DELPHI学习的一点体会
💻 TXT
字号:
oop实现事件调度模型 (2001年2月14日) 

网友更新  分类:杂类   作者:sandboy  推荐:sandboy   阅读次数:371  
(http://www.codesky.net)  

--------------------------------------------------------------------------------

unit Schema;

interface
uses
Windows,Classes,SysUtils,contnrs;

const CAPACITY = 100;

//*********************事件基本类**************************//
type TSEvent=class(TObject)
public
evtTime : TDateTime;
Enabled : Boolean;
evtDes : String;

public

//构造函数,指定事件触发时间
constructor Create (tse :TSEvent); overload;
constructor Create(et: TDateTime) ; overload;

//如果其子类中需要做清除工作应实现以下析构函数
//destructor Destroy; override;

//事件是否允许启动函数
function Ready : boolean;

//事件描述函数
function description():String ;

//事件的实现函数
//此函数调用后应设置 Enabled := FALSE;
procedure action(); virtual;abstract;

procedure setEvtTime(et :TDateTime);
procedure setEvtDes(ed : String);

end;

//*********************事件调度类**************************//
type TSchema=class(Tobject)
private
next,count : Integer;
public
eventSet : array[0..CAPACITY - 1] of TSEvent;

public
procedure add(evt : TSEvent);
procedure remove(evt : TSEvent);
procedure run();
constructor Create();
end;


implementation

//*********************事件类方法实现部分**********************//
//*TSEvent事件构造函数
constructor TSEvent.Create (tse :TSEvent);
Begin

evtTime := tse.evtTime;
evtDes := String(tse.evtDes);
Enabled := tse.Enabled;
End;

//*TSEvent事件构造函数,设置响应时间
constructor TSEvent.Create(et : TDateTime);
Begin

evtTime := et;
evtDes := '基本事件类型' + char(0);
if (now >= evtTime) then
Begin
Enabled := FALSE;
End
Else
Enabled := TRUE;
End;


//*TSEvent判断事件是否已经可以被调用
function TSEvent.Ready : boolean;
Begin
// if 1=1 then
if Enabled and (now >= evtTime) then
Begin
Result := TRUE;
exit;
End
Else
Begin
Result := FALSE;
exit;
End;
End;

//*TSEvent返回事件描述
function TSEvent.description():String ;
Begin
Result := evtDes;
End;

//*TSEvent设置活动时间
procedure TSEvent.setEvtTime(et :TDateTime);
Begin
evtTime := et;
End;

//*TSEvent设置事件描述
procedure TSEvent.setEvtDes(ed : String);
Begin
evtDes := ed;
End;

//*TSchema 构造函数
constructor TSchema.Create() ;
Begin
count := 0;
next := 0;
End;

//*TSchema 增加事件到事件队列中
procedure TSchema.add(evt : TSEvent);
Begin
if count <= 100 then
Begin
count := count + 1;
eventSet[count] := evt ;
End;
End;

//*********************事件调度类方法实现部分**********************//
//*TSchema 去掉事件队列中的事件
procedure TSchema.remove(evt : TSEvent);
var
i ,j: Integer;
Begin
if count = 0 then exit;

for i := 0 to count - 1 do
Begin
if eventSet[i] = evt then
Begin
//eventSet.Delete(i);
//eventSet.Capacity := eventSet.Count ;
for j := i + 1 to count do
eventSet[j - 1] := eventSet[j];

//重新开始事件队列循环
next := 0;
eventSet[count].Free ;
eventSet[count] := nil;
count := count -1;
End;
End;
End;

//*TSchema 循环判断事件队列中事件是否符合执行条件,符合则执行
// 在框架窗口中采用TTimer控件调用run函数
procedure TSchema.run();
var
tTSEvent : TSEvent;
Begin
next := (next + 1) mod Count ;
tTSEvent := eventSet[next -1] ;
if tTSEvent.Ready then
Begin
tTSEvent.action ;
tTSEvent.Enabled := FALSE;


//*************************
//可在此处插入写log日志的代码
//*************************

//*************************
//如事件为可重复调用,则可在此添加代码,以计算出下此调用时间为参数,调用
//pTSEvent^.setEvtTime函数,并重新设置 pTSEvent^.Enabled := TRUE;
//*************************

End;
End;


end.

//frm class

unit SchemaFrm;

interface

uses
Schema, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls,contnrs;

type
TForm1 = class(TForm)
Memo1: TMemo;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type testEvent = class(TSEvent)
public
procedure action(); override;
// constructor Create (tse :testEvent); overload;
// constructor Create (et: TDateTime); overload;
end;

var
Form1: TForm1;
te :array [0..4] of testEvent;
ts : TSchema;
implementation

{$R *.DFM}

procedure testEvent.action();
Begin
Form1.Memo1.Lines.Add (description + #13);
End;
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
ts := TSchema.Create ;
for i := 0 to 4 do
Begin
te[i] := testEvent.Create(now + 0.0001);
te[i].setEvtDes ('测试事件' + char(0) );
ts.add (te[i]);
End;
end;
{
constructor testEvent.Create (tse :testEvent);
Begin

evtTime := tse.evtTime;
evtDes := String(tse.evtDes);
Enabled := tse.Enabled;
End;

constructor TestEvent.Create(et : TDateTime);
Begin

evtTime := et;
evtDes := '基本事件类型' + char(0);
if (now >= evtTime) then
Begin
Enabled := FALSE;
End
Else
Enabled := TRUE;
End;
}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ts.run;
end;

end.
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -