这个版本除了增加新的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. "挡位"还是"档位",究竟谁错了

    http://baijiahao.baidu.com/s?id=1581395663965196858&wfr=spider&for=pc 对于“挡”与“档”两个字,我一直并没有给以太 ...

  2. Spring Cloud(4):断路器(Hystrix)

    Hystrix介绍 相对于单一系统,分布式系统更容易遇到故障,所以我们一般通过构建冗余,使用集群和负载均衡来保证系统的弹性和高可用.当然,这种方式只解决了一部分问题,当服务崩溃时,我们很容易检测到,因 ...

  3. reduce过滤数组

    原始数据 const data = [{ id: , spec: '规格1', rules: [{ rank: , breaks: }, { rank: , breaks: }, { rank: , ...

  4. 【ABAP系列】SAP ABAP 为表维护生成器创建事务代码

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 为表维护生成器 ...

  5. MATLAB实现图像的代数运算

    目录 1.使用求补运算对各类图像进行处理 2.利用imlincomb函数将图像的灰度值放大1.5倍 3.利用imlincomb函数计算两幅图像的平均值. 4.图像的加法运算 5.利用imnoise函数 ...

  6. bg_imgae

  7. jstat 命令

    NAME jstat - Monitors Java Virtual Machine (JVM) statistics. This command is experimental and unsupp ...

  8. 获得http请求的RequestID

    firefox: F12---network---响应, 请求一个页面:

  9. 走近kafka-文件存储

    过期的数据才会被自动清除以释放磁盘空间.比如我们设置消息过期时间为2天,那么这2天内的所有消息都会被保存到集群中,数据只有超过了两天才会被清除. Kafka只维护在Partition中的offset值 ...

  10. Ruby Rails学习中:Ruby内置的辅助方法,基础内容回顾补充

    一. Ruby内置的辅助方法 1.打开文件:app/views/layouts/application.html.erb(演示应用的网站布局) 来咱把注意力放在圈起来的那一行: 这行代码使用 Rail ...