unit IOCPQueue;

interface

uses windows, classes;

type

TOnQueueProc = procedure(sender: tobject; ParamA, ParamB: integer) of object;

TIOCPQueue = class
  private
    FCompletionPort: THandle;
    FOnQueueProc: TOnQueueProc;
    FOverlapped: Overlapped;
    procedure Run;
  public
    constructor create(OnQueueProc: TOnQueueProc);
    destructor Destroy; override;
    procedure PostQueueState(ParamA, ParamB: integer);
    procedure Close;
  end;

implementation
  uses SysUtils;

{ TIOCPQueuue }

//Post关闭消息
procedure TIOCPQueue.Close;
begin
  PostQueuedCompletionStatus(FCompletionPort, 0, 0, @FOverlapped);
end;

//创建完成端口
constructor TIOCPQueue.create;
begin
  FOnQueueProc := OnQueueProc;
  FCompletionPort := CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
  if FCompletionPort = 0 then
    raise Exception.Create('TIOCPQueue Create Error FCompletionPort=0');

TThread.CreateAnonymousThread(Run).Start;
end;

//关闭完成端口句柄
destructor TIOCPQueue.Destroy;
begin
  Close;
  CloseHandle(FCompletionPort);
  inherited;
end;

//提交完成端口消息
procedure TIOCPQueue.PostQueueState(ParamA, ParamB: integer);
begin
  PostQueuedCompletionStatus(FCompletionPort, ParamA, ParamB, nil);
end;

//查询完成端口,状态
procedure TIOCPQueue.Run;
var
  Transfered: DWORD;
  {$IF RTLVersion > 22.0} //XE2,XE3
   key: NativeUInt    ;
  {$ELSE}
   key: DWORD;
  {$IFEND}
  o: POverlapped;
  ret: bool;
begin
  while true do
  begin
    ret := GetQueuedCompletionStatus(FCompletionPort, Transfered,
      key, POverlapped(o), INFINITE);
    if ret then
    begin
      if o = nil then
        FOnQueueProc(self, Transfered, key)
      else
        break;
    end;
  end;
end;

end.

IOCP实现的任务队列的更多相关文章

  1. 使用IOCP完成端口队列做任务队列

    使用IOCP完成端口队列做任务队列 与其自己费力设计异步任务队列,不如使用WINDOWS内核级的IOCP完成端口队列做任务队列. 1)引用单元 uses windows; 2)定义完成端口句柄 var ...

  2. IOCP 浅析

    http://www.ibm.com/developerworks/cn/java/j-lo-iocp/ https://msdn.microsoft.com/en-us/library/window ...

  3. IOCP数据中间件

    IOCP数据中间件 每包最大8K(8192字节),超过8187字节的数据要分包传输 首包有5个字节的包头:4字节数据长度(告诉对方,此次总共将传输几字节数据) + 1字节命令字(告诉对方,此次请求的何 ...

  4. 破阵九解:Node和浏览器之事件循环/任务队列/异步顺序/数据结构

    前言 本文内容比较长,请见谅.如有评议,还请评论区指点,谢谢大家! >> 目录 开门见山:Node和浏览器的异步执行顺序问题 两种环境下的宏任务和微任务(macrotask &&a ...

  5. (转载)IOCP 浅析

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-iocp/#author   郭 仁祥, 软件工程师, IBM 简介: 传统的 Server/Cli ...

  6. IOCP实现高并发以及与传统socke编程的对比

    前言 传统socket编程中服务端一般为每一个客户端创建一个线程(一对一).这样虽然可以使程序的结构简单明了并且方便对数据处理,但是这些都是建立在创建多个线程的基础上,也就是以牺牲线程为代价.一旦有大 ...

  7. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  8. IOCP Internals

    Buffer Type Buffer I/O 针对Buffer I/O的请求,系统会为其分配一个非换页内存作为缓存区,其大小等同于I/O请求的缓存区大小.对于写操作,I/O管理器在创建IRP时,将请求 ...

  9. 通过IEnumerable和IDisposable实现可暂停和取消的任务队列

    一般来说,软件中总会有一些长时间的操作,这类操作包括下载文件,转储数据库,或者处理复杂的运算. 一种处理做法是,在主界面上提示正在操作中,有进度条,其他部分不可用.这里带来很大的问题, 使用者不知道到 ...

随机推荐

  1. mysql查询-从表1中查询出来的结果重新插入到表1

    原有表结构 CREATE TABLE `t_card_user` ( `id` varchar(32) NOT NULL, `card_user_id` bigint(20) DEFAULT NULL ...

  2. VBA Promming——分支语句(解二元一次方程)

    分支语句 If expression1 Then expressions ElseIf expression2 Then expressions Else expression End If 注:VB ...

  3. html5shiv.js让吃屎的IE6、IE7、IE8支持html5去吧

    插件介绍 用于解决IE9以下版本浏览器对HTML5新增标签不识别,并导致CSS不起作用的问题.所以我们在使用过程中,想要让低版本的浏览器,即IE9以下的浏览器支持,那么这款html5shiv.js是一 ...

  4. Vue构建命令

    node -v npm -v vue -V npm install vue (这个命令不行) 提示信息:+ vue@2.6.10 updated 1 package and audited 1 pac ...

  5. lodash中文说明文档

    lodash中文说明文档 https://www.css88.com/doc/lodash/

  6. docker 应用数据的管理

    容器数据存储的三种方式 docker volume docker管理素质及文件系统的一部分,保存数据最佳方式 bind mounts   将宿主机的文件映射到容器里 tmpfs   存储在宿主机的内存 ...

  7. 创建线程的三种方式_Callable和Runnable的区别

    Java 提供了三种创建线程的方法 通过实现Runnable接口 通过继承Thread接口 通过Callable和Future创建线程 通过实现 Runnable 接口来创建线程 public cla ...

  8. IOS学习笔记3—Objective C—简单的内存管理

    今天简述一下简单的内存管理,在IOS5.0以后Apple增加了ARC机制(Automatic Reference Counting),给开发人员带来了不少的方便,但是为了能更好的理解IOS内存管理机制 ...

  9. (8) tomcat中管理领域、角色及用户

    srverlet Container或web应用程序本身都可以提供控制web应用程序资源的安全防护 前者称为容器管理的安全防护,或者称为应用程序管理安全防护 通过内嵌机制,tomcat提供一些安全防护 ...

  10. db2快速删除大表数据(亲测可用)

    一.推荐.删了不可恢复 TRUNCATE TABLE table_name IMMEDIATE 二. DB2 LOAD FROM d:\DB2_BAK\null.del of del REPLACE ...