zoukankan      html  css  js  c++  java
  • kbmMW Scheduler Tidbits#5

    kbmMW的下一个版本将进一步改进TkbmMWScheduler。调度程序支持添加作业以运行给定相当广泛的时间条件。它还支持在后台运行作业,完成后,以安全和一致的方式处理GUI更新。也就是说,如果您想在后台并行运行多个作业,并且只有当所有后台子作业完成时才调用该作业。
     
    kbmMW将允许您在下一个版本中以简单的方式实现这个操作。下面是例子:
    procedure TForm1.Button10Click(Sender: TObject);
    var
      d1:int64;
    begin
      d1:=TkbmMWTiming.GetTimeUS;
      Scheduler.Run([
       procedure(const AScheduledEvent:IkbmMWScheduledEvent)
       var
          i,n:integer;
          d:int64;
       begin
            AScheduledEvent.Data:=0;
            n:=500;
            d:=TkbmMWTiming.GetTimeUS;
            for i:=0 to n-1 do
            begin
                 if AScheduledEvent.Terminating then
                    break;
                 sleep(10);
            end;
            d:=TkbmMWTiming.Diff(d);
            AScheduledEvent.Data:=d;
       end,
       procedure(const AScheduledEvent:IkbmMWScheduledEvent)
       var
          i,n:integer;
          d:int64;
       begin
            AScheduledEvent.Data:=0;
            n:=400;
            d:=TkbmMWTiming.GetTimeUS;
            for i:=0 to n-1 do
            begin
                 if AScheduledEvent.Terminating then
                    break;
                 sleep(10);
            end;
            d:=TkbmMWTiming.Diff(d);
            AScheduledEvent.Data:=d;
       end]
      )
      .NamedAs('MultipleWithSync')
      .SynchronizedAfterRun(
       procedure(const AScheduledEvent:IkbmMWScheduledEvent)
       begin
            mData.Lines.Add('Run multiple with sync - anonym (uS):'+VarToStr(AScheduledEvent.ChildEvent[0].Data)+','+VarToStr(AScheduledEvent.ChildEvent[1].Data));
            mData.Lines.Add(' Total passed time (uS):'+IntToStr(TkbmMWTiming.Diff(d1)));
       end)
      .Activate;
    end;
    看上面的代码,关键是Run方法,利用数组参数,一次性传递多个过程与方法。在每个作业内部发生的事情是定义了一个Sheculed Event,它又定义了每个处理给定作业的一些子事件的Sheduled Event。
     
    只有当所有作业完成后,才会执行AfterRun方法。
     
    另一个有趣的事情是,AfterRun方法可以利用任何一个子作业提供的数据。在例子中,计算了子作业运行时长,AfterRun方法显示所有子作业的总运行时长。你会看到,例子显示的总时长比单独的子作业的用时稍长,因为是并行运行的,这是正常的结果。
     
    此外,还增加了一些更爽的方法:
    WithObject(AObject:TObject)和WithInterface(AInterface:IInterface),它允许您在对象或事件的接口上进行标记。它可以用于为作业提供数据,或从作业接收数据。
     
    一定要记得这个作业是在多线程中运行,因此,您的对象或接口必须是线程安全的。
     
    最后这个例子显示了一个长时间运行的作业应该如何检查终止。当在运行中的调度事件上调用Terminate方法时,或者当调度程序关闭时,例如由于应用程序关闭而终止。
     
    目前为止就这样了。
  • 相关阅读:
    zmap zgrab 环境搭建
    RF是如何工作的?
    RF的优缺点
    国内NLP的那些人那些会
    B-、B+、B*树
    关于LDA的gibbs采样,为什么可以获得正确的样本?
    LDA算法里面Dirichlet分布的两个参数alpha和beta怎样确定?
    如何确定LDA的主题个数
    SMO算法精解
    奇异值与主成分分析(PCA)
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/13931542.html
Copyright © 2011-2022 走看看