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.

  

最新文章

  1. Spark-shell和Spark-Submit的使用
  2. MongoDB基本使用
  3. Linux进程间通信之共享内存
  4. delphi 控件大全(确实很全)
  5. AngularJS 开发中常犯的10个错误
  6. 007医疗项目-模块一:用户的查找:3.用户表查询的Action和Service
  7. 【avalon】createMap
  8. [Flex] Accordion系列 - Header图标的设置
  9. Unable to write inside TEMP environment path
  10. 容器 set
  11. chrome无法使用非官方商店扩展解决办法
  12. UESTC_基爷与加法等式 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem C&gt;
  13. 2014多校3 Wow! Such Sequence!段树
  14. WCF 学习笔记之异常处理
  15. oracle即时客户端安装方法
  16. S7-200与SMART 200之间进行数据通讯与监控
  17. hadoop fs -text和hadoop fs -cat的区别(转)
  18. JSOUP爬虫示例
  19. MySQL事务描述
  20. hihocoder #1170 机器人 &amp;amp;&amp;amp; 编程之美2015复赛

热门文章

  1. stm32 SPI-FLASH W25Q64
  2. echarts的一点记录
  3. Linux文件(夹)属性
  4. Android笔记(二十) Activity中的跳转和值传递
  5. 【DRF框架】restfull规范
  6. Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?
  7. es其他常用功能
  8. Win10 hosts文件无法保存
  9. linux网络编程之socket编程(十)
  10. 【数组模拟的链表or复杂模拟】PAT-L2-002. 链表去重