• 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方法时,或者当调度程序关闭时,例如由于应用程序关闭而终止。
     
    目前为止就这样了。
  • 相关阅读:
    alpha 冲刺 —— 十分之一
    福大软工 · 第七次作业
    福大软工 · 第八次作业(课堂实战)- 项目UML设计(团队)
    2018软工实践——团队答辩
    福大软工1816 · 第五次作业
    福大软工1816 · 第四次作业
    软工实践第四次作业--结队的第一次合作
    软工实践第二次作业--思索
    华中农业大学第五届程序设计大赛网络同步赛解题报告2(转)
    华中农业大学第五届程序设计大赛网络同步赛解题报告(转)
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/13931542.html
Copyright © 2020-2023  润新知