📄 uthreadworker.~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 + -