【说明】

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引擎的多线程任务的投递和回调处理单元的更多相关文章

  1. HttpServer: 基于IOCP模型且集成Openssl的轻量级高性能web服务器

    2021年4月写过一个轻量级的web服务器HttpServer,见文章: <HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器>,但一直没有时间添加O ...

  2. 基于线程池的多线程售票demo2.0(原创)

    继上回基于线程池的多线程售票demo,具体链接: http://www.cnblogs.com/xifenglou/p/8807323.html以上算是单机版的实现,特别使用了redis 实现分布式锁 ...

  3. 第13章 TCP编程(4)_基于自定义协议的多线程模型

    7. 基于自定义协议的多线程模型 (1)服务端编程 ①主线程负责调用accept与客户端连接 ②当接受客户端连接后,创建子线程来服务客户端,以处理多客户端的并发访问. ③服务端接到的客户端信息后,回显 ...

  4. 在Windows下使用Dev-C++开发基于pthread.h的多线程程序【转】

    在Windows下使用Dev-C++开发基于pthread.h的多线程程序[转]     在Windows下使用Dev-C++开发基于pthread.h的多线程程序   文章分类:C++编程     ...

  5. 我的Android进阶之旅------>Android基于HTTP协议的多线程断点下载器的实现

    一.首先写这篇文章之前,要了解实现该Android多线程断点下载器的几个知识点 1.多线程下载的原理,如下图所示 注意:由于Android移动设备和PC机的处理器还是不能相比,所以开辟的子线程建议不要 ...

  6. 基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现

    设计概述 服务端通信组件的设计是一项非常严谨的工作,其中性能.伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性.可用 ...

  7. github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调

    github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调.仅支持一个server和一个client交互. 地址:https://github.com/rocket049/ ...

  8. 初识NodeJS,一个基于GoogleV8引擎的Javascript运行环境

    思考 首先我们来思考一个问题:我们都知道几乎所有现代主流浏览器都全面支持了ECMAScript 5.1版标准,而JavaScript的标准是ECMAScript.那么我们就容易认为JavaScript ...

  9. XproerIM V2开源,基于XproerUI引擎构架

    资源下载:XproerIM源代码(访问密码:2e47),imServer(访问密码 364c), 技术交流群:6259765 技术支持:3040217208 咨询邮箱:2190615607@qq.co ...

随机推荐

  1. timerTask任务定时器

      简单的一个定时器,异步任务 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void ru ...

  2. javascript with关键字简单用法

    1.简要说明         with 语句可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性.要给对象创建新的属性,必须明确地引用该对象. 2.语法格式 with(object ...

  3. libev ev_io_init学习

    #define ev_io_init(ev,cb,fd,events) / do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } w ...

  4. session会话保持原理

    1. 什么是会话保持? 会话保持是负载均衡最常见的问题之一,也是一个相对比较复杂的问题.会话保持有时候又叫做粘滞会话(Sticky Sessions).会话保持是指在负载均衡器上的一种机制,可以识别客 ...

  5. 使用iTextSharp修改PDF文件(一)

    这个iTextSharp确实是个好东西,可以创建.读取PDF格式的文档,虽然我的需求比较简单,但我首先还是基本上.完整地看完了它的相关文档,不喜欢英文的同志,可以搜索一篇<用C#制作PDF文件全 ...

  6. Git 配置(分布式版本控制系统)

    1.Mac Git 配置文件 既然已经在系统上安装了 Git,你会想要做几件事来定制你的 Git 环境.每台计算机上只需要配置一次,程序升级时会保留配置信息.你可以在任何时候再次通过运行命令来修改它们 ...

  7. 批量 1 insert into select 2 sqldataadapter.update 3 SELECT INTO FROM (要求目标表不存在) 4 AddRange(ef) 5 MySqlBulkLoader.Load() 6 BatchInsert 7 insert bulk

     insert into a(col1,col2) select top 1 '1','2' from a union select top 1 '3','4' from a    SELECT IN ...

  8. php封装数据库函数

    从Thinkphp里面抽离出来的数据库模块,感觉挺好用 common.php <?PHP /** * 通用函数 */ //包含配置文件 if (is_file("config.php& ...

  9. MyEclipse或Eclipse中project的导入和导出

    project的导入:将project放到对应的目录中--打开MyEclipse--光标定位在PackageExp位置(即project创建位置),右键选中并点击"Import-" ...

  10. [译]Spring Boot 构建一个RESTful Web服务

    翻译地址:https://spring.io/guides/gs/rest-service/ 构建一个RESTful Web服务 本指南将指导您完成使用spring创建一个“hello world”R ...