使用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)工作线程从完成端口获取工作任务进行处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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;

  

posted @   delphi中间件  阅读(787)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2014-06-29 中间件的调度
2014-06-29 进程与线程
2014-06-29 软件开发的“差不多”精神
点击右上角即可分享
微信分享提示