【说明】

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. 持续集成工具hudson

     2008-07-08  一.什么是持续集成 持续集成的核心概念 CI 过程会经常构建软件组件:在许多情况下,每当源代码存储库(比如 Subversion 或 ClearCase)中的代码发生变化时, ...

  2. e藏在哪里?

    e约等于2.718,是和pi齐名的自然常数. 在任何一个均匀随机器中,都藏着e. import random def count(): k = 0 s = 0 while s < 1: k += ...

  3. 微信小程序-从零开始制作一个跑步微信小程序

    来源:伯乐在线 - 王小树 链接:http://ios.jobbole.com/90603/ 点击 → 申请加入伯乐在线专栏作者 一.准备工作 1.注册一个小程序账号,得用一个没注册过公众号的邮箱注册 ...

  4. Gedit 有用插件介绍

    刚刚接触Ubuntu,对于高手们用的Vim,本人只能望尘莫及.但是,Ubuntu自带的Gedit让我找到了windows的感觉,而且在添加一些插件后更加喜欢这个工具了. gedit本身带有一些常用插件 ...

  5. label 赋值 , 隐藏 , 显示

    <label name='by_stages_number' id='by_stages_number'></label> document.getElementById(&q ...

  6. C# 禁止datagridview 自动产生列

    dataGridView1.AutoGenerateColumns = false;

  7. ArcGIS 10.2数字化线状要素时自己主动拼接成一条线

    一開始一直和捕捉和经典捕捉过不去.最后才发现找错了地方,原来要Customize.自己定义加入"Continue Feature"工具,将其拖动到界面上的随意工具条内就可以.如图1 ...

  8. Python 文件 write() 方法

    概述 Python 文件 write() 方法用于向文件中写入指定字符串. 在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的. 语法 write() 方法语法如 ...

  9. 如何将shell的打印日志输入到日志文件

    如果shell打印的日志很多,屏幕无法完全显示,需要查看shell执行的情况,这是就需要输入到日值了: 如:echo "2012-6-14" | tee -a my.log -a表 ...

  10. 转 kafka架构简介

    kafka架构 转 http://www.cnblogs.com/chushiyaoyue/p/5612298.html 相关文章: https://www.jianshu.com/p/6233d53 ...