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.

  • 相关阅读:
    RabbitMQ学习笔记
    常用算法之排序(3)
    常用算法之排序(2)
    常用算法之排序(1)
    MySQL 是怎样运行的:从根儿上理解 MySQL:字符集和比较规则
    springboot整合websocket实现一对一消息推送和广播消息推送
    喜大普奔!GitHub中文版帮助文档上线了!
    趣图:这是拿offer极高的面试经验
    推荐十大经典排序算法,再也不用担心面试了!
    谈谈培训机构的骗局
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/5864524.html
Copyright © 2011-2022 走看看