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 }
  • 相关阅读:
    【转】浏览器的渲染:过程与原理
    DOMContentLoaded、ready、load事件的区别
    ES6中export default 与export区别
    require一个node模块什么时候需要加上.default
    【转】函数防抖与函数节流
    【转】JavaScript函数柯里化的一些思考
    【原】javascript笔记之splice和slice这两兄弟为毛这么难记
    【转】JS 的 new 到底是干什么的?
    【原】移动端vue页面点透事件
    【转】用 async/await 来处理异步
  • 原文地址:https://www.cnblogs.com/pengshaomin/p/3910279.html
Copyright © 2011-2022 走看看