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 }

Omnithreadlibary学习(1)-异步执行

时间: 2024-10-03 14:44:54

Omnithreadlibary学习(1)-异步执行的相关文章

Omnithreadlibary学习(3)-IOmniTask异步执行SendMessage

在任务中发送消息, 可以是函数或者对象方法 TOmniTaskMessageEvent = procedure(const task: IOmniTaskControl; const msg: TOmniMessage) of object; TOmniOnTerminatedFunction = reference to procedure(const task: IOmniTaskControl); program main; {$APPTYPE CONSOLE} {$R *.res} us

Omnithreadlibary学习(2)-IOmniTask异步执行

1.使用 procedure Parallel.Async(task: TProc; taskConfig: IOmniTaskConfig); 匿名委托访问网站 program main; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, OtlParallel, OtlTask, IdHttp, Web.HTTPApp, System.classes, WinApi.Windows; procedure HttpGet(Host, URL

MVC5 Entity Framework学习之异步和存储过程

在之前的文章中,你已经学习了如何使用同步编程模型来读取和更新数据,在本节中你将学习如何实现异步编程模型.异步可以使应用程序执行更有效率,因为它可以更有效的使用服务器资源. 同样在本节中你还将学习如何针对实体的insert, update, 和delete操作使用存储过程. 最后将应用程序部署到 Windows Azure. 下面是完成后的页面 为什么要使用异步代码 一个web服务器的可用线程是有限的,在高负载情况下,所有的可用线程可能都在被使用.当出现这种情况时,服务器将无法处理新的请求,直到有

Promise then中回调为什么是异步执行?Promise执行机制问题

今天发现一个问题,看下方代码 let p = new Promise(function(resolve, reject) { resolve(1) console.log('2222'); }); p.then(res => { console.log('1111'); }) 输出结果是2222 1111,而自己想的是1111 2222,带着问题查询之后发现. 原来then后边跟的都是异步执行..学习到了. 此链接是各位大佬的回答https://www.zhihu.com/question/57

异步执行js脚本——防止阻塞

JS允许我们修改页面中的所有方面:内容,样式和用户进行交互时的行为. 但是js同样可以阻塞DOM树的形成并且延迟页面的渲染. 让你的js变成异步执行,并且减少不必要的js文件从而提高性能. JavaScript可以查询和修改DOM和CSSOM JavaScript的执行阻塞了CSSOM的执行 JavaScript 阻塞了DOM的形成,除非特殊声明js异步执行 js是一个同步语言可以修改网页的任何方面: <html> <head> <meta name="viewpo

Windows 商店应用程序异步执行task和调整task优先级

在制作WP8.1手电筒的时候遇到一个问题,手电筒有时候能够点亮有时候点不亮. 在MSDN论坛上面有人告诉我可能是优先级的问题示意叫我使用CoreDispatcher 将task任务提高权限,但是发现还是不行. 后来发现点亮闪关灯需要在UI线程中触发,不能再异步中实现,感觉和画图有点类似不能在非主线程中绘制图片. 下面我就分享怎么利用CoreDispatcher改变task任务的优先级(不过还没有验证,因为我还没有遇到需要改变优先级的task,但是依据Windows运行时API的说明应该是正确的改

MySQL学习系列2--MySQL执行计划分析EXPLAIN

1.Explain语法 EXPLAIN SELECT -- 变体:   EXPLAIN EXTENDED SELECT -- 将执行计划"反编译"成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2.执行计划分析和实例 创建员工表Employee create table Employee ( ID int auto_increment, Ename varchar(32), Age int, Salary float, MID int, P

任务执行和任务处理的异步执行

最近在看<深入剖析Tomcat>,在第四章有讲解Tomcat的默认连接器,和这个连接器有着密切关系的是一个处理器.一个连接器可以对应多个处理器.连接器的作用是从客户端的请求中提取出Socket,然后把Socket传递给处理器来处理用户的请求.需要注意的是连接器的关注点是在接收请求,分派给他下游的处理器去执行,在把Socket传递下去后,连接器在这次请求中的任务已经完成.这里可以看到,连接器和处理器他们是异步进行的,异步的处理为多线程的执行提供了可能. 在这里我要说的是,在看了Tomcat的源码

node js 异步执行流程控制模块Async介绍

1.Async介绍 sync是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 map, reduce, filter, forEach 等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等. 项目地址:https://github.com/caolan/async 2. Async安装 npm install async 3.