zoukankan      html  css  js  c++  java
  • 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.
    

      

  • 相关阅读:
    ubuntu ping响应慢的解决方法
    Linux串口中的超时设置
    GSM07.10协议中串口复用使用的校验算法
    交叉编译中的build、host和target
    mount img
    修改mysql默认字符编码出现的Job failed to start解决方法
    ubuntu下建立NFS共享,并用开发板挂载
    Linux上进行单片机开发
    LwIP移植和使用
    [buuctf] pwnrip
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11080875.html
Copyright © 2011-2022 走看看