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;
  • 相关阅读:
    jquery easyui DataGrid
    easyui datagrid使用
    easyui中datagrid用法,加载table数据与标题
    目前已有的框架
    CSS 块级元素、内联元素概念
    设计中最常用的CSS选择器
    ASP.NET MVC 学习
    CSS边框-属性详解
    Boostrap入门级css样式学习
    Codeforces Round #261 (Div. 2)——Pashmak and Graph
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/12966677.html
Copyright © 2011-2022 走看看