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.
    

      

  • 相关阅读:
    安全机制
    Service
    ubuntu 16.4 安装配置IK6.3.2
    ubuntu openstack windows 镜像制作
    openstack RuntimeError: Unable to create a new session key. It is likely that the cache
    千帆过尽,野草依然
    shiro无法进入授权的方法org.crazycake.shiro.exception.PrincipalInstanceException: class java.util.HashMap must has getter for field: id
    绝望中的希望
    shrio中去掉 login;JSESSIONID
    method 'redisConnectionFactory' threw exception; nested exception is java.lang.NoClassDefFoundError
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11080875.html
Copyright © 2011-2022 走看看