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. SQLite – 删除表

    SQLite -删除表 SQLite DROP TABLE语句用于删除一个表定义和所有相关的数据,索引.触发器.约束和规范许可表. 你使用这个命令时必须小心,因为一旦一个表被删除然后表中所有可用的信息 ...

  2. (转)使用Spring注解方式管理事务与传播行为详解

    http://blog.csdn.net/yerenyuan_pku/article/details/52885041 使用Spring注解方式管理事务 前面讲解了怎么使用@Transactional ...

  3. HTTP隧道代理

    reGeorg的前身是2008年SensePost在BlackHat USA 2008 的 reDuh延伸与扩展.也是目 前安全从业人员使用最多,范围最广,支持多丰富的一款http隧道.从本质上讲,可 ...

  4. vuez init webStorm

    <!-- * @description text !--> <template> <div>#[[$END$]]#</div> </templat ...

  5. python基础一 day8 函数

    函数的定义与函数的调用是两个部分 定义函数的时候里面的代码不执行,等到调用函数的时候再执行 只写return和不写return返回None 函数遇到return,这个函数就被结束            ...

  6. 如何移除不再插入Windows设备的信息

    Howto: Remove devices from Windows that are not connected to the system anymore 如何移除不再插入Windows设备的信息 ...

  7. 已安全化的ActiveX控件卸载时出现"DllUnregisterServer函数出错,错误代码:0x80070002"问题解决

    已安全化的ActiveX控件卸载时出现"DllUnregisterServer函数出错,错误代码:0x80070002"问题解决   情况一:当该控件未注册或者已经卸载时,你尝试卸 ...

  8. 02.28 day03

    print(1 or 3 > 2 and 4 < 5 or 6 and 2 < 7)## while True:# print(11)# print(22)# # break# # ...

  9. tiny4412学习笔记-将uboot、zImage、文件系统烧到emmc中 (转)

    http://blog.chinaunix.net/uid-30025978-id-4788683.html 1.首先还是要将u-boot写入SD卡中从SD卡启动. 使用读卡器将SD插入电脑中,使用u ...

  10. oracle如何重做日志组

    1.查询数据库中的重做日志组 SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STA ...