zoukankan      html  css  js  c++  java
  • Scheduler的WaitRun存在卡死的问题

    为了重显问题,写了下面的代码,重显问题。

    有两种情况,第一种是在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;
  • 相关阅读:
    Visual Studio的框选代码区块功能
    序列化和反序列化
    使用C#采集Shibor数据到Excel
    LiveCharts文档-4基本绘图-3其他
    LiveCharts文档-4基本绘图-2基本柱形图
    LiveCharts文档-4基本绘图-1基本线条图
    LiveCharts文档-3开始-8自定义工具提示
    LiveCharts文档-3开始-7标签
    LiveCharts文档-3开始-6轴Axes
    LeetCode题解汇总(包括剑指Offer和程序员面试金典,持续更新)
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/12966677.html
Copyright © 2011-2022 走看看