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;
    

      

  • 相关阅读:
    《Robust Sparse Coding for Face Recognition》
    安装robotframwork 报错Requirement already satisfied
    python -m pip install --upgrade pip 解决升级不成功问题
    pycharm 导入requests库踩坑帖
    新电脑软件安装及环境变量配置
    monkey参数命令
    adb 命令合集
    【转载】解决Sublime编译Python时出现Decode error
    [转载]Python3 接口自动化测试项目实战一(WEB项目)
    python sublime run快捷键设置
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11105927.html
Copyright © 2011-2022 走看看