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 ...
随机推荐
- driver.switch_to.window(driver.window_handles[0])切换到最新打开窗口
有时,使用selenium 定位页面元素时,浏览器明明打开的是需要定位的页面,但就是定位不到元素.打印一下元素page_source,会发现源码与页面不同. 主要问题是页面没有加载完成导致,需要设置 ...
- 九十二:CMS系统之cms后台登录界面
html <!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="ut ...
- delphi treeview的子节点图标?
代码实现不同的子节点图标效果. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, ...
- Docker在PHP项目开发环境中的应用
http://avnpc.com/pages/build-php-develop-env-by-docker
- 【使用新版mysql驱动的改变】---记忆犹新
关于 版本的问题: 之前安装数据库的时候 安装的mysql 8.0 脚本文件来自5.7 的数据库 maven版本3.5.3 jdk1.8 tomcat 9 跑maven项目的时候 遇到各种问题 ...
- VMware workstation安装Windows Server 2012 R2步骤详解(附下载链接)
话不多说,直接上链接.所需工具: 1.VMware workstation 14.0(版本无所谓) 附链接:https://pan.baidu.com/s/1CrH ...
- web - code/flash
trace 来源: 1. http://traces.cs.umass.edu/index.php/Storage/Storage 源代码: 1.sourceforge 2.github.github ...
- readline安装
wget -c ftp://ftp.gnu.org/gnu/readline/readline-6.2.tar.gz tar -zxvf readline-6.2.tar.gz cd readline ...
- Capacity To Ship Packages Within D Days
A conveyor belt has packages that must be shipped from one port to another within D days. The i-th p ...
- vm下centos7 mini版 NAT模式下配置静态IP
1.查看虚拟机的默认网关和子网掩码 a.vm菜单栏点击编辑->虚拟网络编辑器 b.选择VMnet8,点击NAT设置,查看子网掩码.网关IP 2. 修改服务器的网络配 ...