⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uthreadworker.~pas

📁 本模型是在内存中创建 n 个工人线程, 1. 在无任务时处于休眠状态,不占用CPU时间, 2. 在有任务时,被唤醒,取得任务,完成任务后,又自动休眼.
💻 ~PAS
字号:
{*******************************************************}
{                                                       }
{       简单的线程池模型                                }
{                                                       }
{       单元名: uThreadWorker.pas                       }
{                                                       }
{       作  者: 隐神                                    }
{                                                       }
{       版权所有 (C) 2006 独家村一号                    }
{                                                       }
{*******************************************************}

{*******************************************************
 版本 : 
 主要功能 : 主要功能
 创建日期 : 十月


 版本 :
 修改日期 : 
 修改者 : 
 修改内容 : 

*******************************************************}
unit uThreadWorker;

interface

uses
  Windows, SysUtils, Classes, uPubStructs;

type
  TGetTask = procedure(var VTask: PTask) of object;
  TAnswer = procedure(var ATask: PTask) of object;
  TThreadWorker = class(TThread)
  private
    FAnswer: TAnswer;
    FEvent: THandle;
    FGetTask: TGetTask;
    FID: Integer;
  protected
    procedure Execute; override;
  public
    constructor Create(const CreateSuspended: Boolean; AEvent: THandle;
      AGetTask: TGetTask; AAnswer: TAnswer; AID: Integer);
  end;

implementation

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TThreadWorker.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ TThreadWorker }

{
******************************** TThreadWorker *********************************
}

constructor TThreadWorker.Create(const CreateSuspended: Boolean; AEvent:
  THandle; AGetTask: TGetTask; AAnswer: TAnswer; AID: Integer);
begin
  FEvent := AEvent;
  FGetTask := AGetTask;
  FAnswer := AAnswer;
  FID := AID;

  FreeOnTerminate := True;
  inherited Create(CreateSuspended);
end;

procedure TThreadWorker.Execute;
var
  mTask: PTask;
begin
  while not Terminated do
  begin
    //一直休眠到 FEvent 被管理者线程亮灯为止....
    if FEvent > 0 then
      WaitForSingleObject(FEvent, INFINITE);
    //在管理线程中取任务
    FGetTask(mTask);

    //如果有任务
    if Assigned(mTask) then
    begin
      //处理任务....
      //DoSomething;

      mTask^.FCMD := '线程[' + IntToStr(FID) + ']任务:' + mTask^.FCMD;

      //将处理结果回写
      FAnswer(mTask);
    end;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -