[DIOCP3-IocpTask说明书]基于IOCP引擎的多线程任务的投递和回调处理单元

【说明】

IocpTask是基于Iocp引擎的多线程任务投递和处理单元,可以方便的把任务进行投递到IOCP线程进行统一调度和处理,是模仿QDAC-QWorker的处理方式,支持D7以上的版本。

【使用方法】

使用上很简单,下面解释一种比较全面的方法:

procedure PostATask(pvTaskWork:TOnTaskWork;
       pvTaskData:Pointer = nil;
       pvRunInMainThread:Boolean = False;
       pvRunType:TRunInMainThreadType = rtSync);overload;

 

参数:

   pvTaskWork 

       回调函数,procedure(pvTaskRequest: TIocpTaskRequest) of object;  pvTaskRequest可以访问到传入的taskData,strData等信息。

  pvTaskData

      是传入的数据,为指针类型,可以是任何的数据,在回调函数中可以通过pvTaskRequest对象进行获取得到。

pvRunInMainThread:

      回调函数是否在主线程中运行,考虑到一些需要访问主线程界面的任务,需要在主线程中运行。

pvRunType:

     同步的方式,支持两种,一种是rtSync是使用线程的同步模式,rtPostMessage,使用消息 + Event等待的模式。消息模式考虑到dll中同步方法无法使用时可以采取的同步方式。

 

【注意事项】

     主窗体销毁时,很多资源都已经被销毁,如果此时有投递需要主线程处理的任务,可能会导致主线程挂起,而整个进程无法结束的情况。

 

destructor TfrmMain.Destroy;
begin
  FLogTask.PostATask(onLogMsg, 'abcd', True, rtPostMessage);
  Sleep(100);
  FLogTask.Active := false;
  FLogTask.Free;
  inherited Destroy;
end;

上面的代码会导致程序无法退出,FLogTask.PostATask(onLogMsg, 'abcd', True, rtPostMessage); 是投递到主线程执行的任务,这个时候主窗体正在销毁,无法相应PostMessage的消息(Synchronize方式也是一样会堵塞)导致FMessageEvent会一直等待下去,所以需要注意的是在主窗体销毁的时候不要进行主线程任务的投递。可以在主窗体的destroy中,可以禁止相应投递任务, 在主窗体析构函数的开始,设置Enable := false; 这样iocpTask不会再处理任何的任务,注意是析构函数的第一句,不是窗体的FormDestory事件。

destructor TfrmMain.Destroy;
begin
  FLogTask.Enable := false;
  iocpTaskManager.Enable := False;

  .....

  inherited Destroy;
end;

转载于:https://www.cnblogs.com/DKSoft/p/3958911.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Q: 在Diocp中我需要另外开线程去处理逻辑吗? A: 在编码层(TDiocpCoderTcpServer), 逻辑处理事件(OnContextAction), 是由DiocpTask/Qworker(编译开关(QDAC_QWorker)可以进行切换)驱动的,和底层的通信线程是不相干扰。所以在编码层不需要使用另外的线程池,来处理逻辑。 Q: 同一个连接的OnContextAction会同时被多个线程触发吗? A:编码层的OnContextAction是排队处理的,底层接收到数据后交由注册的解码器进行解码, 解码成功后,放到任务队列,然后依次触发OnContextAction,所以同一个连接的OnContextAction同时只会有一个线程调用。 Q: Diocp的断开日志 A: Diocp在DEBUG模式下面会记录详细的日志。会记录每个连接断开的原因。如下 1> xxxx:[2824]投递发送数据请求时出现了错误。错误代码:10054 说明: 这种日志在发送数据的时候系统返回了错误代码,可以根据错误代码(如10054),查询到相应的错误信息。 2> xxxx: [720]响应接收请求时出现了错误。错误代码:64! 说明:这种日志在响应接收请求时系统返回的错误,根据错误代码查询响应的信息。 3> xxxx: [704]接收到0字节的数据,该连接将断开! 说明: 服务端接收到长度为0字节的数据,认为对方关闭了连接。服务端相应的会释放连接触发OnDiscconected函数。 4> xxxx :[812]执行[CheckNextSendRequest::lvRequest.ExecuteSend]失败: 处理投递发送请求数据包时,发现异步关闭请求(Request.Tag = -1)。进行关闭处理! 说明: 这种日志一般在服务端投递了异步关闭请求(PostWSAClose)时,会出现该日志。 上面列举的日志都是正常的,DIOCP只是记录详细情况,以便出现问题时能有据可查,请勿惊慌。 * 中括号[]中的数字是连接对应的SocketHandle,是连接的套接字句柄。 MSDN上面错误代码说明: https://msdn.microsoft.com/en-us/library/ms740668.aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值