[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();
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;
[DIOCP3-IocpTask说明书]基于IOCP引擎的多线程任务的投递和回调处理单元的更多相关文章
- HttpServer: 基于IOCP模型且集成Openssl的轻量级高性能web服务器
2021年4月写过一个轻量级的web服务器HttpServer,见文章: <HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器>,但一直没有时间添加O ...
- 基于线程池的多线程售票demo2.0(原创)
继上回基于线程池的多线程售票demo,具体链接: http://www.cnblogs.com/xifenglou/p/8807323.html以上算是单机版的实现,特别使用了redis 实现分布式锁 ...
- 第13章 TCP编程(4)_基于自定义协议的多线程模型
7. 基于自定义协议的多线程模型 (1)服务端编程 ①主线程负责调用accept与客户端连接 ②当接受客户端连接后,创建子线程来服务客户端,以处理多客户端的并发访问. ③服务端接到的客户端信息后,回显 ...
- 在Windows下使用Dev-C++开发基于pthread.h的多线程程序【转】
在Windows下使用Dev-C++开发基于pthread.h的多线程程序[转] 在Windows下使用Dev-C++开发基于pthread.h的多线程程序 文章分类:C++编程 ...
- 我的Android进阶之旅------>Android基于HTTP协议的多线程断点下载器的实现
一.首先写这篇文章之前,要了解实现该Android多线程断点下载器的几个知识点 1.多线程下载的原理,如下图所示 注意:由于Android移动设备和PC机的处理器还是不能相比,所以开辟的子线程建议不要 ...
- 基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现
设计概述 服务端通信组件的设计是一项非常严谨的工作,其中性能.伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性.可用 ...
- github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调
github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调.仅支持一个server和一个client交互. 地址:https://github.com/rocket049/ ...
- 初识NodeJS,一个基于GoogleV8引擎的Javascript运行环境
思考 首先我们来思考一个问题:我们都知道几乎所有现代主流浏览器都全面支持了ECMAScript 5.1版标准,而JavaScript的标准是ECMAScript.那么我们就容易认为JavaScript ...
- XproerIM V2开源,基于XproerUI引擎构架
资源下载:XproerIM源代码(访问密码:2e47),imServer(访问密码 364c), 技术交流群:6259765 技术支持:3040217208 咨询邮箱:2190615607@qq.co ...
随机推荐
- 收到新信息,弹出popup窗口提示
- [转]NLP数据集
原文链接 nlp-datasets Alphabetical list of free/public domain datasets with text data for use in Natural ...
- js触摸事件
touch事件的绑定 电脑端的mouseDown,mouseUp,mouseMove分别对应移动端的touchstart,touchend,touchmove 下面的代码判断浏览器是电脑端还是移动端, ...
- Android开发环境内容汇总
Android开发环境将分为SDK相关内容.Eclipse ADT相关内容.模拟器AVD相关内容.调试器DDMS相关内容.日志LogCat相关内容.连接驱动ADB相关内容.内存泄露检测工具MAT相关 ...
- iOS中消息传递方式
iOS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式. 1.通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. NSNotificati ...
- dubbo 学习(5) dubbo多协议和多注册中心
转载 http://blog.csdn.net/songjinbin/article/details/49498431 一.配置dubbo多协议模式 1.默认协议 Dubbo缺省协议采用单一长连接和N ...
- Android--------从一个包中的Avtivity创建另外另外一个包的Context
Android中有Context的概念,想必大家都知道.Context可以做很多事情,打开activity.发送广播.打开本包下文件夹和数据库.获取classLoader.获取资源等等.如果我们得到了 ...
- Linux命令-进程后台执行:nohup(就是不挂起的意思)
nohup 就是不挂起的意思( no hang up) 用途:LINUX命令用法,不挂断地运行命令. 语法: nohup Command [ Arg ... ] [ & ] 描述:nohup ...
- tomcat默认密码,admin,manager密码需要自己设置,tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="tomc ...
- MS SQL Server查询优化方法 查询速度慢的原因很多,常见如下几种
1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大 ...