zoukankan      html  css  js  c++  java
  • IOCP实现的任务队列

    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.

  • 相关阅读:
    CentOS最常用命令
    cssreset
    mysql cmd连接 乱码
    帮朋友转发招聘信息 南京知名互联网公司招聘java、测试、前端,具体私聊
    InputStream写文件出现大量NUL
    iOS app开发资料整理
    完美的视图旋转算法
    Windows上使用clang编译
    nodejs
    Rpath handling on Linux
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/5864524.html
Copyright © 2011-2022 走看看