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.

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM