红鱼儿

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方法时,或者当调度程序关闭时,例如由于应用程序关闭而终止。
 
目前为止就这样了。

posted on 2020-11-05 14:35  红鱼儿  阅读(257)  评论(0编辑  收藏  举报