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.
    

      

  • 相关阅读:
    MS CRM 2011 C#中获取Web Resource
    MS CRM 2011 Form与Web Resource在JScript中的相互调用
    MS CRM 2011 JScript操作lookup control
    MS CRM 2011 导出Ribbon的定义
    MS CRM 2011 为64位Outlook安装Silverlight
    MS CRM 2011 JScript getValue 与 setValue方法
    MS CRM 2011 在JScript中同步和异步使用REST Endpoint
    C#实现全局快捷键(系统热键)响应(转)
    程序隐藏启动的C#实现经验
    WinForm程序启动时不显示主窗体
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11080875.html
Copyright © 2011-2022 走看看