• 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;
  • 相关阅读:
    tf_upgrade_v2.exe实验
    tf.random_uniform出错tensorflow2.0出错
    Tensorflow2.0变化
    Anaconda安装PyTorch
    Anaconda是如何进行版本管理的?
    CUDA开发指南
    Tensorflow视频教程&Pytorch视频教程
    Applied Spatiotemporal Data Mining应用时空数据挖掘
    GAN one-shot
    基于深度学习的图像超分辨率重建 一种基于非负矩阵分解的高光谱影像模拟方法
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/12966677.html
Copyright © 2020-2023  润新知