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.

  • 相关阅读:
    Ajax与JSON的一些总结
    ASP.NET Cache的一些总结
    8个非常有用的HTML5工具
    Trie树和Ternary Search树的学习总结
    仿微博字符统计和本地存储功能的实现
    SQL Server 高性能写入的一些总结
    Deadlock的一些总结
    Javascript Context和Scope的一些学习总结
    网络攻击技术——Broken authentication
    Ember.js的一些学习总结
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/5864524.html
Copyright © 2011-2022 走看看