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.
    

      

  • 相关阅读:
    Visual Studio 2010的活动,有兴趣的朋友可以来参加
    .NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略
    Javascript 返回上一页
    Entity Framework 4.0新增对TSQL的支持
    .Net 4.0中支持的更加完善了协变和逆变
    c#4.0——泛型委托的协变、逆变
    JQuery 常用方法基础教程
    AspNetPager分页示例
    微软一站式示例代码浏览器
    UI与实体的映射
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11080875.html
Copyright © 2011-2022 走看看