这个版本除了增加新的SmartBinding功能,同时提供了大量的功能更新以及bug修正。其中,SmartBinding的介绍,xalion已经第一时间写了初识kbmmw 中的smartbind功能,同时还写了XML-RPC和 JSON-RPC的支持文章。kbmMW的福音,向xalion敬礼!关于SmartBinding,在这个版本没发布前,就第一时间翻译了作者的博文:SmartBinding与kbmMW#1,我想这些资料可以让大家轻松的使用这个让人兴奋的功能了!

因为常用Scheduler,所以先看看这个版本为Scheduler做了哪些改变?

1.为IkbmMWScheduledEvent接口添加了方法SyncQueued:IkbmMWScheduledEvent,功能类似于Synchronized,用来把线程任务(作业)在主线程中同步运行,不同的是SyncQueued以非阻塞方式将操作放进队列,以防止某些死锁产生。

2.增加方法:

IkbmMWScheduledEvent.AfterEnd

IkbmMWScheduledEvent.SynchronizedAfterEnd

这是可选的方法,如果实现了该方法,一但方法被执行过,那么将永远不会被再次执行。

3.增加IkbmMWScheduledEvent.Executed:boolean属性,如果事件至少执行过一次,则返回true。

4.为IkbmMWScheduledEvent接口添加了属性OnAnonymousAfterEndProcedure:TkbmMWOnAnonymousScheduledProcedure和OnSimpleAnonymousAfterEndProcedure:TkbmMWOnSimpleAnonymousScheduledProcedure,具体同AfterEnd的功能一样。

5.为IkbmMWScheduledEvent接口添加了属性IsSynchronized,指示事件是否正在Synchronized或SyncQueued中执行。

6.为TkbmMWScheduler.Unschedule和Clear等方法添加了可选的const AWait:boolean = true参数。

7.修正了kbmMW Scheduler中的多个bug及一些内存泄漏问题。

8.IkbmMWScheduledEvent增加了EndingAfterRuns方法,该方法可用于在x次成功运行后结束和停用事件。

9.IkbmMWScheduledEvent增加了EndingAfterStalls方法,该方法可用于在x次失败运行后结束和停用事件。

10.IkbmMWScheduledEvent增加了UnscheduleAtEnd方法,该方法控制是否自动取消计划并释放正在结束的事件,默认为false。

以上内容,基本翻译的这个版本更新说明中关于Scheduler的内容。下面,准备用代码来试试这些功能的应用情况,及会带给我们什么益处。

1.对于新增加SyncQueued方法,本质上,就是通过TThread.Queue与TThread.Synchronize来调用线程作业代码的区别。所以,这里理解TThread.Queue与TThread.Synchronize的区别就完全懂了。

procedure TForm6.Button1Click(Sender: TObject);
begin
Scheduler.Run(procedure
var
I: Integer;
begin
for I := to do
begin
text1.Text:=i.ToString;
end;
end)
.SyncQueued//.Synchronized
.Activate;
end;

上面代码,其中的匿名函数,就是通过TThread.Queue来执行的。如果将.SyncQueued换成.Synchronized,则通过TThread.Synchronize来执行。

作者为什么加了这个SyncQueued支持呢?原来,在这一版本中,作者在实现SmartBind时用到,具体在单元kbmMWSmartBind的TkbmMWBindings.Update方法中,可以参考学习更进一步的用法。

2.新增加的AfterEnd与SynchronizedAfterEnd:

这两个方法,到底是什么业务意义呢?与AfterRun及SynchronizedAfterRun又有什么区别呢?经过查看代码及测试,原来是这样:

原有的AfterRun及SynchronizedAfterRun是在每个子线程任务完成后被调用,也就是说,当Scheduler发起10个线程,那么每个线程执行完后,都会调用AfterRun及SynchronizedAfterRun,这样的话AfterRun及SynchronizedAfterRun会被调用10次,与之不同,现在的AfterEnd与SynchronizedAfterEnd是Scheduler发起的10个线程都执行完成后被调用,也就是说不管Scheduler执行多少线程,AfterEnd与SynchronizedAfterEnd都只被调用一次。默认情况下,AfterEnd与SynchronizedAfterEnd是不被调用的,为了在Scheduler完成所有任务之后调用AfterEnd,需要设置一下:

.UnscheduleAtEnd(true)

这一点很重要的!(不知道作者为什么默认情况下不调用AfterEnd与SynchronizedAfterEnd)。

3.TkbmMWScheduler.Unschedule和Clear

这两个方法,其中Unschedule,取消指定的线程任务,Clear是清理掉所有的线程任务。增加了AWait参数,默认值为True,表示,在取消或清理线程作业时,如果线程任务正在执行,则等待任务执行完成。当前,前提是线程任务没有在主线程中执行。

kbmMW 5.09测试报告(1)-Scheduler的更多相关文章

  1. 开启kbmmw 5.09 中的XML-RPC和 JSON-RPC 服务

    kbmmw 5.09 里面增加了XML-RPC和 JSON-RPC 服务支持,但是默认没有开启. 需要在安装前,修改kbmMWConfig.inc文件. 加入以下定义 {$DEFINE KBMMW_J ...

  2. kbmmw 5.09 发布

    New stuff        =========        - Added kbmMWSmartBind.pas unit with optional kbmMWSmartBindVCL.pa ...

  3. kbmMW 5.09.00是个必须升级的版本!

    这几天遇到的几个问题,从5.08.10升级到5.09.00,自然解决了! 所以建议大家都升级到这个版本. 例如我遇到的问题: 1.在线程中使用ClientQuery注意的问题 2.Invalid pr ...

  4. 解决kbmMW Scheduler在任务中停止任务遇到的问题

    procedure TCustomGridViewCameraDoc.InitSchedule; begin Scheduler.Schedule( procedure(const ASchedule ...

  5. 使用kbmmw 实现图形验证码

    首先感谢图形验证码的提供者  晴空无彩虹  https://blog.csdn.net/u011784006/article/details/80827181 他用FMX 实现了验证码的生成,我修改成 ...

  6. 在线程中使用ClientQuery注意的问题

    今天遇到奇怪的问题,在线程中建立一个TkbmMWClientQuery的临时对象q,及一个TkbmMWBinaryStreamFormat的临时对象bsf,第一次执行正常,再次执行时一直等待,也不产生 ...

  7. spark 实现TOP N

    数据量较少的情况下: scala> numrdd.sortBy(x=>x,false).take(3) res17: Array[Int] = Array(100, 99, 98) sca ...

  8. Spark 0.9.1和Shark 0.9.1分布式安装指南

    目录 目录 1 1. 约定 1 2. 安装Scala 1 2.1. 下载 2 2.2. 安装 2 2.3. 设置环境变量 2 3. 安装Spark 2 3.1. 部署 2 3.2. 下载 3 3.3. ...

  9. Invalid property value

    又见这个错误!头几天同事遇到这个问题,我查到去年写的并按此解决了,原文在这里,查了半天,才查出是ftShortInt造成的这个错误. 当我们在设计期将ClientQuery.Active设置为True ...

随机推荐

  1. VBA读写XML文件

    'Write XML file Sub WriteXML(fpa$, fn$) Dim xmlfile As String xmlfile = ThisWorkbook.Path & &quo ...

  2. JavaScript中"Uncaught TypeError: Cannot set property 'innerHTML' of null"错误

    写了一个函数,在调用时出错:"Uncaught TypeError: Cannot set property 'innerHTML' of null" 代码如下: <!DOC ...

  3. for(foo('a') ; foo('b') && (i<2);foo('c'))的执行结果

    static boolean foo(char c) { System.out.println(c); return true; } public static void main(String[] ...

  4. Oracle 对某张表中的某一列进行取余,将结果集分为多个集合

    比如分为 5个集合,那么就用某一列和5 取余 ,分别可以取  余数为 0.1.2.3.4 的结果集,那么就把集合分为5个小的集合了 1.取余数为 0 的集合 select * from (select ...

  5. nodejs获取常见疾病数据示例

    日常生活中有一些常见的疾病,这个可以通过百度等搜索到,但是如果你要完成一款app或者小程序.网站之类的该如何来获取常见疾病的信息呢?首先想到的是通过爬虫爬取数据,然后整理搜索....其实这种方法还是太 ...

  6. 一百一十七:CMS系统之注册页面对接短信验证码

    from flask import Blueprint, requestfrom exts import alidayufrom utils import restfulfrom utils.capt ...

  7. IPv6 ping命令

    IPv6 ping命令 一.Linux操作系统 给一台 Linux 主机分配了一个 IPv6 的 IP地址,如何使用 ping命令 确定该 IP地址 能否 ping 通呢? 1.查看主机的 IPv6 ...

  8. Linux md5sum 命令

    Linux md5sum 命令 通过 Linux 的 md5sum 命令,可以对指定的文件,计算出唯一的一个MD5值(128bit). 通过比较文件前后的MD5值,可以判断文件是否发生变化(是否被修改 ...

  9. MATLAB学习(三)元素访问和常用代数运算

    >> A=[1,2;3,4],B=[0,2;4,5] A = 1 2 3 4 B = 0 2 4 5 >> C=A>=B C = 1 1 0 0 >> D=A ...

  10. U盘ios系统制作

    首先我们先安装软碟通,完成安装后打开软碟通,文件->打开,打开我们的iso镜像 步骤阅读   然后选择我们的U盘 步骤阅读   然后点击启动->写入硬盘映像 步骤阅读   写入方式有zip ...