Delphi下多线程控件BMDThread使用详解
目录
- 控件下载
- 线程类设计
- 创建一个简单的线程
BMDThread控件是一套相当成熟的线程控件,使用它可以让你快速的创建、管理线程。它支持Delphi5-Delphi12
控件下载
https://download.csdn.net/download/gust2013/89908682
线程类设计
unit BMDThread;interfaceusesWindows, Messages, SysUtils, Classes, Controls, Forms, Syncobjs, ExtCtrls; // 导入需要的模块type{ 前向声明类 }TBMDThread = class;TBMDExecuteThread = class;TBMDThreadGroup = class;{ 线程事件类型定义 }TBMDThreadNotifyEvent = procedure(Sender: TObject; Thread: TBMDExecuteThread) of object; // 线程通知事件TBMDThreadDataNotifyEvent = procedure(Sender: TObject; Thread: TBMDExecuteThread; var Data: Pointer) of object; // 线程数据通知事件TBMDThreadUpdateNotifyEvent = procedure(Sender: TObject; Thread: TBMDExecuteThread; var Data: Pointer; Percent: Integer) of object; // 线程更新通知事件TBMDThreadSynchroNotifyEvent = procedure(Sender: TBMDThread; Thread: TBMDExecuteThread) of object; // 线程同步通知事件TBMDThreadSynchroDataNotifyEvent = procedure(Sender: TBMDThread; Thread: TBMDExecuteThread; var Data: Pointer) of object; // 线程同步数据通知事件{ TBMDExecuteThread 类 }TBMDExecuteThread = class(TThread) // 继承自 TThreadprivateprotectedThreadOwner: TBMDThread; // 线程所有者FData: Pointer; // 线程数据指针FNotifyEvent: TNotifyEvent; // 通知事件FThreadNotifyEvent: TBMDThreadSynchroNotifyEvent; // 线程通知事件FThreadDataNotifyEvent: TBMDThreadSynchroDataNotifyEvent; // 线程数据通知事件UpdateData: Pointer; // 更新数据指针procedure Execute(); override; // 执行方法,重载 TThread 的 ExecutepublicPercentProgress: Integer; // 进度百分比constructor Create(AThreadOwner: TBMDThread; AUpdateData: Pointer); virtual; // 构造函数procedure DoNotifySynchro; // 同步通知procedure DoThreadNotifySynchro; // 线程通知同步procedure DoThreadNotifySynchroData; // 线程数据通知同步procedure Synchronize(SynchroEvent: TNotifyEvent); overload; // 同步方法(重载)procedure Synchronize(SynchroEvent: TBMDThreadSynchroNotifyEvent); overload; // 同步方法(重载)procedure Synchronize(SynchroEvent: TBMDThreadSynchroDataNotifyEvent; Data: Pointer); overload; // 同步方法(重载)// 以下两个方法 已废弃,不应再使用!>>>>procedure Synchronize(SynchroEvent: TBMDThreadNotifyEvent); overload; // 同步方法(已废弃)procedure Synchronize(SynchroEvent: TBMDThreadDataNotifyEvent; Data: Pointer); overload; // 同步方法(已废弃)// <<< 已废弃,不应再使用property Terminated; // 线程终止属性end;{ TBMDThreadBase 类 }TBMDThreadBase = class(TComponent) // 继承自 TComponentprivateFOnUpdate: TBMDThreadUpdateNotifyEvent; // 更新事件FOnStart: TBMDThreadDataNotifyEvent; // 启动事件FOnTerminate: TBMDThreadDataNotifyEvent; // 终止事件FThreadGroup: TBMDThreadGroup; // 线程组FUpdatePriority: Integer; // 更新优先级protectedUpdateCriticalSection: TCriticalSection; // 线程安全的临界区function GetRuning(): Boolean; virtual; abstract; // 获取是否正在运行(抽象方法)procedure SetThreadGroup(AThreadGroup: TBMDThreadGroup); // 设置线程组procedure ReportStarted(ThreadGroup: TBMDThreadGroup); virtual; abstract; // 报告线程开始(抽象方法)procedure ReportTerminated(ThreadGroup: TBMDThreadGroup); virtual; abstract; // 报告线程终止(抽象方法)function AddMe(AThreadGroup: TBMDThreadGroup) : Boolean; virtual; abstract; // 将自己添加到线程组(抽象方法)procedure RemoveMe(AThreadGroup: TBMDThreadGroup); virtual; abstract; // 从线程组移除自己(抽象方法)publicconstructor Create(Owner: TComponent); override; // 构造函数destructor Destroy; override; // 析构函数procedure Start(); overload; virtual; abstract; // 启动方法(抽象方法)procedure Start(Data: Pointer); overload; virtual; abstract; // 启动方法(重载,抽象)procedure Stop(); virtual; abstract; // 停止方法(抽象方法)procedure Suspend(); virtual; abstract; // 暂停方法(抽象方法)procedure Resume(); virtual; abstract; // 恢复方法(抽象方法)publicproperty Runing: Boolean read GetRuning; // 运行状态属性property ThreadGroup: TBMDThreadGroup read FThreadGroup write SetThreadGroup; // 线程组属性property UpdatePriority: Integer read FUpdatePriority write FUpdatePriority default 0; // 更新优先级属性property OnUpdate: TBMDThreadUpdateNotifyEvent read FOnUpdate write FOnUpdate; // 更新事件属性property OnStart: TBMDThreadDataNotifyEvent read FOnStart write FOnStart; // 启动事件属性property OnTerminate: TBMDThreadDataNotifyEvent read FOnTerminate write FOnTerminate; // 终止事件属性end;{ TBMDThread 类 }TBMDThread = class(TBMDThreadBase) // 继承自 TBMDThreadBaseprotectedFUpdateTimer: TTimer; // 更新定时器FOnExecute: TBMDThreadDataNotifyEvent; // 执行事件FExecuteThread: TBMDExecuteThread; // 执行线程FPriority: TThreadPriority; // 线程优先级FUpdateEnabled: Boolean; // 更新是否启用FInterrupted: Boolean; // 是否中断procedure OnUpdateTimer(Sender: TObject); virtual; // 定时器更新事件处理procedure Execute(); virtual; // 执行方法(重载)procedure OnThreadTerminate(Sender: TObject); virtual; // 线程终止事件处理procedure OnThreadTerminateClose(Sender: TObject); virtual; // 线程终止关闭处理procedure ReportStarted(ThreadGroup: TBMDThreadGroup); override; // 报告线程开始(重载)procedure ReportTerminated(ThreadGroup: TBMDThreadGroup); override; // 报告线程终止(重载)function AddMe(AThreadGroup: TBMDThreadGroup) : Boolean; override; // 将自己添加到线程组(重载)procedure RemoveMe(AThreadGroup: TBMDThreadGroup); override; // 从线程组移除自己(重载)procedure SetTimeInterval(TimeInterval: Cardinal); // 设置时间间隔function GetTimeInterval(): Cardinal; // 获取时间间隔procedure SetPriority(Value: TThreadPriority); // 设置线程优先级function GetPriority(): TThreadPriority; // 获取线程优先级function GetRuning(): Boolean; override; // 获取是否正在运行(重载)function GetEmptyEntry(): TPersistent; // 获取空条目procedure SetUpdateEnabled(Value: Boolean); // 设置更新是否启用publicconstructor Create(Owner: TComponent); override; // 构造函数destructor Destroy; override; // 析构函数procedure Start(); overload; override; // 启动方法(重载)procedure Start(Data: Pointer); overload; override; // 启动方法(重载)procedure Stop(); override; // 停止方法(重载)procedure Suspend(); override; // 暂停方法(重载)procedure Resume(); override; // 恢复方法(重载)property Runing; // 运行状态属性property Interrupted: Boolean read FInterrupted; // 中断状态属性property Thread: TBMDExecuteThread read FExecuteThread; // 执行线程属性publishedproperty RefreshInterval: Cardinal read GetTimeInterval write SetTimeInterval default 100; // 刷新间隔属性property Priority: TThreadPriority read GetPriority write SetPriority default tpNormal; // 线程优先级属性property ThreadGroup; // 线程组属性property UpdatePriority; // 更新优先级属性property UpdateEnabled : Boolean read FUpdateEnabled write SetUpdateEnabled; // 更新启用状态属性property SynchroMethods: TPersistent read GetEmptyEntry; // 同步方法属性property OnExecute: TBMDThreadDataNotifyEvent read FOnExecute write FOnExecute; // 执行事件属性property OnUpdate; // 更新事件属性property OnStart; // 启动事件属性property OnTerminate; // 终止事件属性end;{ TBMDThreadGroup 类 }TBMDThreadGroup = class(TBMDThreadBase) // 继承自 TBMDThreadBaseprotectedThreadItemsList: TList; // 线程项目列表ThreadsList: TList; // 线程列表FOnThreadUpdate: TBMDThreadUpdateNotifyEvent; // 线程更新事件FOnThreadStart: TBMDThreadDataNotifyEvent; // 线程启动事件FOnThreadTerminate: TBMDThreadDataNotifyEvent; // 线程终止事件// 由临界区保护FCountRuning: Integer; // 正在运行的线程计数function GetRuning(): Boolean; override; // 获取是否正在运行(重载)function GetCountRuning(): Integer; virtual; // 获取正在运行的线程计数(抽象方法)function GetThreadItemsCount(): Integer; // 获取线程项目数量function GetThreadItems(Index: Integer): TBMDThreadBase; // 获取指定索引的线程项目function GetThreadsCount(): Integer; // 获取线程数量function GetThreads(Index: Integer): TBMDThread; // 获取指定索引的线程procedure ReportStarted(ThreadGroup: TBMDThreadGroup); override; // 报告线程开始(重载)procedure ReportTerminated(ThreadGroup: TBMDThreadGroup); override; // 报告线程终止(重载)function AddMe(AThreadGroup: TBMDThreadGroup) : Boolean; override; // 将自己添加到线程组(重载)procedure RemoveMe(AThreadGroup: TBMDThreadGroup); override; // 从线程组移除自己(重载)function LinkedToMe( ThreadBase : TBMDThreadBase ) : Boolean; // 检查是否与指定线程相连publicconstructor Create(Owner: TComponent); override; // 构造函数destructor Destroy; override; // 析构函数procedure Start(); overload; override; // 启动方法(重载)procedure Start(Data: Pointer); overload; override; // 启动方法(重载)procedure Stop(); override; // 停止方法(重载)procedure Suspend(); override; // 暂停方法(重载)procedure Resume(); override; // 恢复方法(重载)function AddThread(AThread: TBMDThread) : Boolean; // 添加线程procedure RemoveThread(AThread: TBMDThread); // 移除线程function AddThreadGroup(AThreadGroup: TBMDThreadGroup) : Boolean; // 添加线程组procedure RemoveThreadGroup(AThreadGroup: TBMDThreadGroup); // 移除线程组procedure ThreadStarted(Sender: TObject; Thread: TBMDExecuteThread; var Data: Pointer); // 线程启动事件处理procedure ThreadUpdate(Sender: TObject; Thread: TBMDExecuteThread; var Data: Pointer; AUpdatePriority: Integer; PercentProgres: Integer); // 线程更新事件处理procedure ThreadTerminated(Sender: TObject; Thread: TBMDExecuteThread; var Data: Pointer); // 线程终止事件处理publicproperty Runing; // 运行状态属性property CountRuning: Integer read GetCountRuning; // 正在运行的线程计数属性property ThreadItemsCount: Integer read GetThreadItemsCount; // 线程项目数量属性property ThreadItems[Index: Integer]: TBMDThreadBase read GetThreadItems; // 线程项目属性property ThreadsCount: Integer read GetThreadsCount; // 线程数量属性property Threads[Index: Integer]: TBMDThread read GetThreads; // 线程属性publishedproperty ThreadGroup; // 线程组属性property UpdatePriority; // 更新优先级属性property OnUpdate; // 更新事件属性property OnStart; // 启动事件属性property OnTerminate; // 终止事件属性property OnThreadUpdate: TBMDThreadUpdateNotifyEvent read FOnThreadUpdate write FOnThreadUpdate; // 线程更新事件属性property OnThreadStart: TBMDThreadDataNotifyEvent read FOnThreadStart write FOnThreadStart; // 线程启动事件属性property OnThreadTerminate: TBMDThreadDataNotifyEvent read FOnThreadTerminate write FOnThreadTerminate; // 线程终止事件属性end;
创建一个简单的线程
procedure TForm1.BMDThread1Execute(Sender: TObject; Thread: TBMDExecuteThread; var Data: Pointer);
vari: Integer;beginValue1 := 0;for i := 0 to 1000 - 1 dobeginThread.PercentProgress := i div 10;SleepEx(20, false);if (Thread.Terminated) thenbreak;Inc(Value1);Thread.Synchronize(SynchroEvent1);end;
end;procedure TForm1.SynchroEvent1(Sender: TObject);
beginLabel2.Caption := IntToStr(Value1);
end;procedure TForm1.BMDThread1Start(Sender: TObject; Thread: TBMDExecuteThread; var Data: Pointer);
beginLabel1.Caption := 'Start';Button1.Enabled := false;Button2.Enabled := true;//Data指针指向Label2,外部可以直接访问Label2Data := Label2;
end;procedure TForm1.BMDThread1Terminate(Sender: TObject; Thread: TBMDExecuteThread; var Data: Pointer);
beginLabel1.Caption := 'Stop';Button1.Enabled := true;Button2.Enabled := false;
end;procedure TForm1.Button1Click(Sender: TObject);
beginBMDThread1.Start();
end;