zoukankan      html  css  js  c++  java
  • Omnithreadlibary学习(1)-异步执行

    program main;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      System.SysUtils,
      OtlParallel;
    begin
      Parallel.Async(procedure
      var
        i: Integer;
      begin
      for I := 0 to 100 do
         Writeln(Format('No.%d', [i]));
      end);
      Writeln('执行一');
      Sleep(100);
      Writeln('执行二');
      Sleep(100);
      Writeln('执行三');
      Sleep(100);
      Readln;
    end.
    

     输出结果:

     

     程序非常简单

     引用OtlParallel.pas单元 创建一个匿名函数控制台输出1..10 

     跟进源码看到下面两个函数

    procedure Parallel.Async(task: TProc; taskConfig: IOmniTaskConfig);
    
    TOmniTaskDelegate = reference to procedure(const task: IOmniTask);//TOmniTaskDelegate 任务委托声明
    procedure Parallel.Async(task: TOmniTaskDelegate; taskConfig: IOmniTaskConfig);

    第一个函数Async 接受一个TProc的匿名函数, taskConfig默认为nil (IOmniTaskConfig应该是设置任务的一些属性后面在研究)

    实际内部调用用了Parallel.Async(task: TOmniTaskDelegate; taskConfig: IOmniTaskConfig) 

    方便使用

    class procedure Parallel.Async(task: TProc; taskConfig: IOmniTaskConfig);
    begin
      Async(
        procedure (const omniTask: IOmniTask)
        begin
          task;
        end,
        taskConfig
      );
    end; { Parallel.Async }
    
    class procedure Parallel.Async(task: TOmniTaskDelegate; taskConfig: IOmniTaskConfig);
    var
      omniTask  : IOmniTaskControl;
      terminated: TOmniTaskConfigTerminated;
    begin
      if assigned(taskConfig) then
        (taskConfig as IOmniTaskConfigInternal).DetachTerminated(terminated);
      omniTask := CreateTask(task, 'Parallel.Async').Unobserved.OnTerminated(
        procedure (const task: IOmniTaskControl)
        var
          exc: Exception;
        begin
          terminated.Call(task);
          exc := task.DetachException;
          if assigned(exc) then
            raise exc;
        end
      );
      Parallel.ApplyConfig(taskConfig, omniTask);
      omniTask.Unobserved;
      omniTask.Schedule(GetPool(taskConfig));
    end; { Parallel.Async }
  • 相关阅读:
    使用Mybatis时报错Invalid bound statement (not found):
    MyBatis学习(3)
    选数字
    看程序写结果
    NP
    完全平方数
    hahaha
    haha

    凝视
  • 原文地址:https://www.cnblogs.com/pengshaomin/p/3910279.html
Copyright © 2011-2022 走看看