zoukankan      html  css  js  c++  java
  • 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,指示事件是否正在SynchronizedSyncQueued中执行

    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 := 1 to 10000 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,表示,在取消或清理线程作业时,如果线程任务正在执行,则等待任务执行完成。当前,前提是线程任务没有在主线程中执行。

  • 相关阅读:
    11 dubbo monitor
    svn ignore忽略文件
    Java Core Dump分析过程
    10 其他
    9 jenkins
    8 jenkins
    7 nhorizons项目结构
    6 发布个人项目到私服
    5 jenkins使用gitee
    4 Linux安装git
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/10872394.html
Copyright © 2011-2022 走看看