为了重显问题,写了下面的代码,重显问题。
有两种情况,第一种是在Run方法中,产生异常,这会造成主线程中执行的ev.WaitRun进入死循环。第二种是不在Run方法中产生异常,而是写了AfterRun子句,这也产生同样的问题。对此,写了测试项目并反馈给作者,期待下一版本能修正。
这个问题很严重的,因为作者在其代码中也有多处使用了WaitRun,我是使用文件比较的功能时,发现了这个问题。
procedure TForm2.Button1Click(Sender: TObject); var ev: IkbmMWScheduledEvent; begin ev := Scheduler.Run( procedure(const AEvent: IkbmMWScheduledEvent) begin raise Exception.Create('Error Message'); end) .WhenException( procedure(const AEvent: IkbmMWScheduledEvent; const AException: Exception) begin TThread.Synchronize(nil,procedure begin Label1.Caption:='Exception:'+AException.Message; Label1.Update; end); end) .Precise .Activate; try // finally ev.WaitRun; // Wait forever end; ShowMessage('Scheduled Event is finish!'); //Can’t execute here end; procedure TForm2.Button2Click(Sender: TObject); var ev: IkbmMWScheduledEvent; begin ev := Scheduler.Run( procedure(const AEvent: IkbmMWScheduledEvent) begin sleep(1000); end) .AfterRun(procedure begin TThread.Synchronize(nil,procedure begin Label1.Caption:='AfterRun'; Label1.Update; end); end) .Precise .Activate; try // finally ev.WaitRun; // Wait forever end; ShowMessage('Scheduled Event is finish!'); //Can’t execute here end;
2020-06-01:kbmMW 5.12解决了!
但下面这种写法中,要把AfterRun替换成.SynchronizedAfterRun。
procedure TForm2.Button2Click(Sender: TObject); var ev: IkbmMWScheduledEvent; begin ev := Scheduler.Run( procedure(const AEvent: IkbmMWScheduledEvent) begin sleep(1000); end) .AfterRun(procedure begin TThread.Synchronize(nil,procedure begin Label1.Caption:='AfterRun'; Label1.Update; end); end) .Precise .Activate; try // finally ev.WaitRun; // Wait forever end; ShowMessage('Scheduled Event is finish!'); //Can’t execute here end;