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.