zoukankan      html  css  js  c++  java
  • 使用IOCP完成端口队列做任务队列

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

    与其自己费力设计异步任务队列,不如使用WINDOWS内核级的IOCP完成端口队列做任务队列。

    1)引用单元

    uses windows;

    2)定义完成端口句柄

    var g_iocp_handle: THandle;            // 完成端口句柄

    3)创建完成端口

      g_iocp_handle := CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, si.dwNumberOfProcessors);

    4)将任务提交给完成端口

    PostQueuedCompletionStatus(g_iocp_handle, 0, 0, POverlapped(pRecvPack));

    5)工作线程从完成端口获取工作任务进行处理

    procedure TWorkerThread.Execute;
    var
      pRecvPack: PTRecvPack;
      pDecodePack: PTDecodePack;
      param1: DWORD;
      {$IFNDEF xe}
      param2: DWORD;
      {$ELSE}
      param2: NativeUInt;
      {$ENDIF}
      len: Integer;
    begin
      inherited;
      try
        while not Self.Terminated do
        begin
          // 取一个数据包 从队列
          if Windows.GetQueuedCompletionStatus(g_iocp_handle, param1, param2, POverlapped(pRecvPack), 1) then
          begin
            // 终止while
            if pRecvPack = nil then
            begin
              Dispose(pRecvPack);
              Break;
            end;
    
              // 开始解码
            New(pDecodePack);
            pDecodePack^.socket := pRecvPack^.socket;
              // 解码包头
            pDecodePack^.msgHead := DecodeMessage(LeftStr(pRecvPack^.data, DEFBLOCKSIZE));
              // 解码包体 如有
            len := Length(pRecvPack^.data);
            if len > DEFBLOCKSIZE then
              pDecodePack^.msgBody := DecodeString(RightStr(pRecvPack^.data, len - DEFBLOCKSIZE));
              // 释放指针
            Dispose(pRecvPack);
              // 处理消息 开始
            case pDecodePack^.msgHead.MsgID of
              CM_LOGIN:
                Self.login(pDecodePack);
              CM_PASSWORD:
                Self.password(pDecodePack);
              CM_CTOC:
                Self.cToc(pDecodePack);
            end;
              // 释放指针
            Dispose(pDecodePack);
          end;
    
        end;
      except
        on e: Exception do
          WriteLog('TWorkerThread.Execute ' + e.Message);
      end;
    end;
    

      

  • 相关阅读:
    php socket 模型及效率问题
    深入浅出讲解:php的socket通信
    发现一个nginx LUA开发Web App的框架
    centos6.x 抓取ssh登录的用户名和密码
    使用Lua的扩展库LuaSocket用例
    Lua开发
    ngx.location.capture 只支持相对路径,不能用绝对路径
    PHP获得数组的交集与差集
    php用explode,可以提供多个字符作为分割符来进行分割数组吗?
    resizable可调整尺寸组件
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11105927.html
Copyright © 2011-2022 走看看