kbmMW 5.09测试报告(1)-Scheduler
这个版本除了增加新的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的更多相关文章
- 开启kbmmw 5.09 中的XML-RPC和 JSON-RPC 服务
kbmmw 5.09 里面增加了XML-RPC和 JSON-RPC 服务支持,但是默认没有开启. 需要在安装前,修改kbmMWConfig.inc文件. 加入以下定义 {$DEFINE KBMMW_J ...
- kbmmw 5.09 发布
New stuff ========= - Added kbmMWSmartBind.pas unit with optional kbmMWSmartBindVCL.pa ...
- kbmMW 5.09.00是个必须升级的版本!
这几天遇到的几个问题,从5.08.10升级到5.09.00,自然解决了! 所以建议大家都升级到这个版本. 例如我遇到的问题: 1.在线程中使用ClientQuery注意的问题 2.Invalid pr ...
- 解决kbmMW Scheduler在任务中停止任务遇到的问题
procedure TCustomGridViewCameraDoc.InitSchedule; begin Scheduler.Schedule( procedure(const ASchedule ...
- 使用kbmmw 实现图形验证码
首先感谢图形验证码的提供者 晴空无彩虹 https://blog.csdn.net/u011784006/article/details/80827181 他用FMX 实现了验证码的生成,我修改成 ...
- 在线程中使用ClientQuery注意的问题
今天遇到奇怪的问题,在线程中建立一个TkbmMWClientQuery的临时对象q,及一个TkbmMWBinaryStreamFormat的临时对象bsf,第一次执行正常,再次执行时一直等待,也不产生 ...
- spark 实现TOP N
数据量较少的情况下: scala> numrdd.sortBy(x=>x,false).take(3) res17: Array[Int] = Array(100, 99, 98) sca ...
- 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. ...
- Invalid property value
又见这个错误!头几天同事遇到这个问题,我查到去年写的并按此解决了,原文在这里,查了半天,才查出是ftShortInt造成的这个错误. 当我们在设计期将ClientQuery.Active设置为True ...
随机推荐
- Delphi连接sql数据库怎么判断连接是否成功呢
一切属性都设置好后,我在Button里 ADOConnection1.Connected := True;这样连的,之后如何判断是否连接成功了呢?查询一下数据试试?有更直接的办法吗? -------- ...
- Markdown 入门基础
MarkDown基础语法 标题 通过 # 来实现标题效果.在markdown当中,标题与html相似,一共有六级标题. # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### ...
- Python3 Selenium自动化web测试 ==> 第六节 WebDriver高级应用 -- 操作web页面的滚动条
学习目的: 掌握页面元素定位以外的其他重要知识点. 正式步骤: 测试Python3代码 # -*- coding:utf-8 -*- from selenium import webdriver fr ...
- iOS UITextField限制输入字数
关于iOS的文本框有时需要限制字数,如手机号,在UITextField的代理单纯写一个判断,在字数超过限制时,这时再想删除就删除不掉,可以在代理这样写,就解决 - (BOOL)textField:(U ...
- k8s nginx-ingress 504 timeout
nginx ingress 报错 504 timeout,是由于反向代理超时造成的,反向代理默认超时时间60s 官方文档 配置片段: apiVersion: extensions/v1beta1 ki ...
- C学习笔记-函数
函数的定义 返回值类型 函数名([[参数类型 参数名1],[参数类型 参数名2],···,[参数类型 参数n]]) { //执行语句 return 返回值; } 返回值类型:用于限定函数返回值的数据类 ...
- 第12课.经典问题解析(const;指针和引用)
问题1:const什么时候为只读变量?什么时候是常量? const常量的判别准则: a.只有用字面量初始化的const常量才会进入符号表(直接初始化过的const为常量) b.被使用其他变量初始化的c ...
- airflow原理
官网: http://airflow.apache.org/installation.html 原理: https://www.cnblogs.com/cord/p/9450910.html 原理介绍 ...
- kafka修改topic副本数
工作案例: 大数据开发用系统脚本自动在kafka建topic,检查后才发现副本数只有1个,存在数据丢失的风险.需要立刻把副本数改为3个. 开始干活,首先想到的是下面的命令: ${BIN_PATH}/k ...
- javascript的一些有用函数记录,不断更新。。。
addLoadEvent函数: 众所周知,html文档加载完后会立即执行一个onload函数.但是onload函数只能包含一个被执行的函数,也就是你需要在加载完文档后执行的一个自己的函数.在实际中ht ...