从去年开始,kbmmw 慢慢增加内涵,除了完善各种服务外,陆续增加和扩展了作为一个中间件必须有的功能,

例如,权限管理、日志系统、调度系统、内存调试等功能。

今天给大家介绍一下kbmmw 的调度事件,调度事件的主要目标就是”在指定时间干,必须干“,不是“爱干”不干,是“必须干” :)。

在传统的delphi 中事件调度室通过两种方式,一种方式通过Ttimer 来实现,(我20年做的母校的食堂餐饮消费系统就是通过Ttimer来轮询

POS 机的)。另外一种就是通过扩展Tthread 线程类,通过后台完成一些指定事件。

利用Ttimer 来完成事件调度,其实是一个松散的调度,其依靠windows 的消息机制,如果一个事件在指定事件没有做完,

那么后面的消息就会被忽略,这样会丢失一些事件,在很多场合是不允许的。

利用扩展线程实现调度,可以比较精确的执行调度事件,但是由于多线程编写程序复杂,而且精确时间的计算也要一定的

功力及技巧,一般开发者往往望而却步。

那么怎么办呢? kbmmw 来帮忙,在新版的kbmmw 中,加入了TkbmMWSchedule 类,这个类用来完成事件调度,完成

”在指定时间干,必须干“这个任务。这个类简单易用,不但简单易用,而且包括了很多调度启动、关闭的相关操作。

TkbmMWScheduler 类不但是一个任意数量调度事件的容器,也是一个调度事件的管理器。确保这些事件在正确的事件被执行。

Kbmmw 自带一个标准的TkbmMWScheduler 类,名称就叫kbmMWScheduler,这个是kbmmw 自用的,你同样可以用它,当然

了,你也可以任性自己再建一个自己独立的。

ok. 让我们先简单的看一下一个例子。

kbmMWScheduler.Schedule(OnScheduledEvent).EverySecond(10).Activate(true);

以上的代码就是让调度器每10秒做一件事情。在调度事件里面我们可以写一下代码。

function TForm1.OnScheduledEvent(const AScheduledEvent:IkbmMWScheduledEvent):boolean;

begin

call('无为,干活');

result:=True;

end;

这样这个事件就一直被执行下去,无为估计就会疯了:)

为了不让无为发疯,我们需要可以停止这个事件。那么为了能够停止这个事件,我们需要先给这个调度定义,以

方便我们后面停止这个调度操作。

以下代码来控制这个调度

var

myevent:IkbmMWScheduledEvent;

myevent:=kbmMWScheduler.Schedule(OnScheduledEvent).EverySecond(10).Activate(true);

好了,我们知道是哪个事件了,后面就好办了。

myevent.Active:=false;

这样,无为就消停了(无为到底是什么鬼?)。

当然了,我们也可以通过强行命名一个调度器,以便后面方便操作。

kbmMWScheduler.Schedule(OnScheduledEvent).NamedAs(‘xalion’).EverySecond(10).Activate(true);

这样,后面可以通过名称查找这个调度,然后操作这个调度

xalionev:=kbmMWScheduler.GetByName(‘xalion’);

kbmmw 中的时间调度有两种,一种是松散调度,一种是精确调度。

松散调度是通过一个线程池来完成的,所有的调度时间共享一个线程池,它保证事件的运行,但是不保证精确度。由于是共享线程池,

因此松散调度调度节省系统资源,这种调度适合于数据备份等场合,例如确保每天晚上12点左右备份数据,但是没有必要在12:00:00

那一瞬间执行这个事件,kbmmw 中默认调度为松散调度。但是某些场合,我们必须在精确的指定时间执行一个事件,例如上、下课铃声,我们谁也不愿意

下课时间到了,还没听见下课铃声。这个就需要精确事件调度,为了适合满足这种要求,kbmmw 为其单独建立一个线程,确保

这个事件精确按时执行,代价是会增加系统资源的使用(当然了也有例外,如果系统本身很忙,例如CPU 负载100%,神仙也没办法了)。

建立精确事件调度在kbmmw 里面也很简单,代码如下,

kbmMWScheduler.Schedule(OnScheduledEvent).NamedAs(‘xalion’).EverySecond(10).Precise.Activate(true);

当然了,你也可以用下面代码定义松散调度。

kbmMWScheduler.Schedule(OnScheduledEvent).NamedAs(‘xalion’).EverySecond(10).Relaxed.Activate(true);

kbmmw 不但支持秒为执行间隔,还有很多间隔方法。

EveryMSecond(n)  ---每n毫秒,什么东西要这么快?

EveryMinute(n) -------每n分钟,测量心跳?

EveryHour(n)---------每n小时,当n=1 时,8次就可以下班了?不可能

EveryDay(n) -----------每n天,当n=1 时,就是程序猿的闹钟

EveryMonth(n) ----------每n月一次,当n=1 时,是什么?

EveryYear(n) --------------你开发的系统,能n年不重新启动?

其实这个n 可以是小数, EveryDay(0.5) 就是半天。

注意,很人性化的一点出现了

EveryDay(1).EveryHour(6)  是多少呢? 呵呵,其实就是EveryHour(30),24+6=30 小时。

那么 EveryMonth(2.5).EveryHour(3) 是多少呢? 2.5 个月到底是多长时间?自己调试吧。

每个星期几必须要做,怎么办?

AtWeekDays([mwwdSunday,mwwdWednesday])

在指定的日期范围内执行也很简单

.StartingAt(TkbmMWDateTime.Create(‘2015-11-22T15:00:00GMT’)).
.EndingAt(TkbmMWDateTime.Create(‘2015-12-22T15:00:00GMT’)).
 
如果你想在执行前等一会儿,也没问题
DelayInitial(TkbmMWDuration.Create(10)).
 
你也可以只让这个调度事件只做一次
.Occurs(mwsoOnce).
 
 
 
当然了,你也可以通过写匿名函数来替换调度事件
FScheduler.Schedule(
function(const AScheduledEvent:IkbmMWScheduledEvent):boolean
begin
mData.Lines.Add('anonymous:'+AScheduledEvent.Name);
Result:=true;
End
).NamedAs('Relaxed event Every 2 secs').EverySecond(2).Synchronized.Activate(true);
 
不知道kbmmw这样的调度,是否能满足你的需要?如果不满足,那你就自己写吧,反正我不会写。
 
 

在指定时间干,必须干(kbmmw 中的事件调度)的更多相关文章

  1. [UE4]Child Widget中的事件调度器

    在Child Widget中新建事件调度器,就会自动在使用该Child Widget的父级界面的事件列表中自动自动出现.功能十分强大.

  2. 记录-MySQL中的事件调度Event Scheduler

    下面是自己的实例 /*查询event是否开启(查询结果Off为关闭 On为开启)*/show variables like '%sche%'; /*开启/关闭命令(1开启--0关闭)*/set glo ...

  3. 事件调度器及C++中的使用

    转自:http://blog.ch-wind.com/ue4-event-dispatcher-and-delegate/ 事件调度器非常的适合在各个蓝图之间实现通信功能. 当前UE4版本4.8.3. ...

  4. kbmmw 中的日期时间操作

    为了精确度反映时间及时区,kbmmw 里面专门有一个单元处理日期时间,由于很多同学习惯了delphi 自带的Tdatetime,使用这个时会有一些疑惑,因此今天就单独说一下这个. 首先kbmmwdat ...

  5. 珍惜每一滴水(kbmmw 中的内存调试)

    作为一个服务器端的应用,最基本的要求就是稳定,当然要做一个稳定的服务器端,需要涉及到很多方面, 内存泄露就是稳定的一个致命杀手,因为服务器的物理内存是有限的,即使一个功能有很小的内存泄露,经过 长时间 ...

  6. Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。

    Python3 与 C# 面向对象之-继承与多态   文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...

  7. kbmmw中向服务器端传递对象的一种简单方式

    运行环境:delphi 10.2+kbmmw 5.6.20 在kbmmw 的老版本中,要向服务器传送一个本地的对象,一般都需要进行一些转换,例如通过序列化的方式. 在新版的kbmmw中这一切都变的很简 ...

  8. 【转】Expire Google Drive Files 让Google Docs云盘共享连接在指定时间后自动失效

    最近在清理Google Docs中之前共享过的文件链接,发现Google Docs多人协作共享过的链接会一直存在,在实际操作中较不灵活.正好订阅的RSS推送了Pseric写的这篇文章 - Expire ...

  9. KBMMW 中 IOS IPv6 的解决

    自从今年苹果强制新上架的APP 必须支持Ipv6,很多原来需要网络支持的APP 就没法上架了. 别的我们就不说了,先说说kbmmw 中,如何解决这个问题. 要测试你的app 是否支持ipv6, 首先要 ...

随机推荐

  1. FormatFloat 格式化浮点数

    #和0的区别: #是对应位有值显示,无值不显示 0是对应位有值显示,无值显示0 分号后的字符串是对负值的格式化特殊定义:  s := FormatFloat(.);   .);   .);   .); ...

  2. windows下安装boost库

    工作中现在会接触boost,所以我计划两个月之内努力熟悉一下boost.今天在自己win10系统上尝试安装了boost库,下面把遇到的问题总结一下: 1. 下好1.61版本库,在boost目录下运行b ...

  3. 现代DOJO(翻译)

    http://dojotoolkit.org/documentation/tutorials/1.10/modern_dojo/index.html 你可能已经不用doio一段时间了,或者你一直想保持 ...

  4. Spring IoC容器总结(未完)

    在面向对象系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上.这些依赖关系可以通过把对象的依赖注入交给框架或IOC容器来完成,这种从具体对象手中交出控制的做法是非常有价 ...

  5. Allegro 快捷键设置

    一.快捷键设置 Allegro可以通过修改env文件来设置快捷键,这对从其它软件如AD或PADS迁移过来的用户来说,可以沿用以前的操作习惯,还是很有意义的. Allegro的变量文件一共有2个:一个是 ...

  6. navicat 连接 oracle

    环境:windows2008r2(x64) oracle 11.2.0.1 1.找到Oracle服务端的NetManager程序(一般在开始菜单->oracle->配置和移植工具)中,修改 ...

  7. .NET4.5 异步编程 async和await

    msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...

  8. Cookie实现商品浏览记录--方式二:JS实现

    使用Cookie实现商品浏览记录:方式二:JS方法实现cookie的获取以及写入.当某一个产品被点击时,触发JS方法.利用JS方法判断一下,此产品是否在浏览记录中.如果不存在,则将产品ID加入到coo ...

  9. 没想到cnblog也有月经贴,其实C#值不值钱不重要。

    呵呵,就不倚老卖老了,从basic走过来,一路经历vb,vf,delphi,C#,php,asp,html,js,css,太多太多的开发语言,包括面向对象编程思想,语义化页面结构等等,除了高级的编程技 ...

  10. Android jar包的导出和使用

    一.工程打成JAR包. 1.       eclipse下有一工程JsnTxJar,右键工程名选择Export. 选择Java->JAR file 下图所示左边一栏只勾选src,右边一栏都不用勾 ...