DIOCP任务队列和工作线程
DIOCP任务队列和工作线程
涉及4个单元文件:utils_strings.pas,utils_queues.pas,utils_queueTask.pas,utils_grouptask.pas。
TDQueueTask,只给任务队列开启一个工作线程来执行队列中的任务。
TGroupTask,可以给任务队列指定要开启几个工作线程来执行队列中的任务。
其实,单使用TGroupTask就可以了,可以将TDQueueTask看作是TGroupTask的子集。
大致原理:往队列中提交任务(入队),工作线程从队列中获取任务(出队),通过回调函数来执行任务。
下面上演示代码(DELPHI7测试通过):
/// <author>cxg 2019-6-25</author> unit Unit1; interface uses
utils_grouptask, utils_queueTask, Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type
TTest = record
f1: string;
end; PTest = ^TTest; type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
task: TDQueueTask;
task2: TGroupTask;
procedure callback(pSender: TDQueueTask; pvTaskData: Pointer);
procedure callback2(pvSender: TGroupTask; pvWorker: TGroupTaskWorker; pvData: Pointer);
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.callback(pSender: TDQueueTask; pvTaskData: Pointer);
begin
Caption := PTest(pvTaskData).f1;
Dispose(pvTaskData);
end; procedure TForm1.callback2(pvSender: TGroupTask;
pvWorker: TGroupTaskWorker; pvData: Pointer);
begin
Caption := PTest(pvData).f1;
Dispose(pvData);
end; procedure TForm1.FormCreate(Sender: TObject);
var
p, p2: PTest;
begin
task := TDQueueTask.Create;
task.OnExecute := callback;
New(p);
p.f1 := '我是一个任务';
task.PostATask(p); task2 := TGroupTask.Create;
task2.CheckCreateWorker(1);
task2.OnWorkerExecute := callback2;
New(p2);
p2.f1 := '我是二个任务';
task2.PostATask(p2);
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(task);
FreeAndNil(task2);
end; end.
DIOCP任务队列和工作线程的更多相关文章
- 简单分析ThreadPoolExecutor回收工作线程的原理
最近阅读了JDK线程池ThreadPoolExecutor的源码,对线程池执行任务的流程有了大体了解,实际上这个流程也十分通俗易懂,就不再赘述了,别人写的比我好多了. 不过,我倒是对线程池是如何回收工 ...
- JAVA之工作线程数究竟要设置多少
一.需求缘起 Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设 ...
- IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的
IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫" ...
- android中工作线程安全
当应用程序启动,创建了一个叫“main”的线程,用于管理UI相关,又叫UI线程.其他线程叫工作线程(Work Thread). Single Thread Model 一个组件的创建并不会新建一个线程 ...
- IIS减少工作线程阻塞的方法
IIS的工作进程(w3wp.exe)只提供了有限的工作线程(Work Thread)来处理请求.如果这些线程都因为要等待长时间运行的任务而阻塞,则运行时会将新来的请求排队,而不是立即执行,Web服务器 ...
- 你真的了解:IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数 吗?
原文链接:http://www.cnblogs.com/yinhaichao/p/4060209.html?utm_source=tuicool&utm_medium=referral 一般购 ...
- 工作线程AfxBeginThread的使用
工作线程通常用来执行一些后台任务,如:数据计算.后台杀毒等等.因为不需要创建窗口和处理用户消息,编写比较容易,在程序中只要调用AfxBeginThread 函数就可以创建并启动一个工作线程了. Afx ...
- 工作线程基类TaskSvc
工作线程基类TaskSvc 前端时间用ACE写代码,发ACE_Task确实好用.不但能提供数量一定的线程,还能够让这些继承的线程函数自由访问子类的private和protected变量.此外,ACE_ ...
- web workers工作线程
web worker工作线程是Html5里面提出来的一个新api,对于JavaScript我们的印象是单线程执行,如果运行复杂运算的时候,页面可能就会失去响应,是运行在后台的javascript,独立 ...
随机推荐
- javascript_06-控制流程
流程控制 程序的三种基本结构 顺序结构 选择结构 循环结构 判断语句 if 语法: if(condition){ //todo }else if{ //todo }else{ //todo } var ...
- 爬虫之 BeautifulSoup与Xpath
知识预览 BeautifulSoup xpath BeautifulSoup 一 简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: '' ...
- Zabbix MySQL percona 模板部署
Zabbix MySQL percona服务端执行以下操作https://www.zabbix.com/download?zabbix=4.0&os_distribution=centos&a ...
- linux网络编程之system v消息队列(一)
经过上次对于进程通讯的一些理论的认识之后,接下来会通过实验来进一步加深对进程通讯的认识,话不多说,进入正题: 其实还可以通过管道,但是,管道是基于字节流的,所以通常会将它称为流管道,数据与数据之间是没 ...
- k8s的日志
日志 • K8S系统的组件日志 • K8SCluster里面部署的应用程序日志 方案一:Node上部署一个日志收集程序 • DaemonSet方式部署日志收集程序 • 对本节点/var/log ...
- Vue中img的src属性绑定
正确:<img :src=" 'files/'+value.src "> 或 <img :src="value.src">错误:< ...
- Selenium常用API的使用java语言之19-调用JavaScript代码
虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法.在这种情况下,就可以借助JavaScript来控制浏览器的滚动条.WebDriver提供了execu ...
- Solr添加paoding分词器
1.Solr3.6.2 并可运行 paoding-analysis3.0.jar 下载 2.1 解压{$Solr-Path}/example/webapp 下的solr.war文件,解压到当前文件夹 ...
- NodeJS事件环
1. 执行顺序说明 1. 清空主执行栈 2. 清空微任务队列 3. 运行一个timer队列的回调函数,询问微任务队列,如果有回调函数,清空. 4. 循环第3步,直到清空timer队列 5. 进入pol ...
- Laravel 报 Nginx 502 : Bad Gateway 错误
1 问题再现1.1 Laravel 6.1.0,在前端数据修改,标题中包含有中文符号:.或<>,Nginx 报502 错误. 1.2 在 TEXT 字段中保存则不存在此问题 2 排查过程 ...