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