使用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;
标签:pDecodePack,end,队列,IOCP,Self,端口,pRecvPack 来源: https://www.cnblogs.com/hnxxcxg/p/11105927.html