当前位置: 首页 > news >正文

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;

http://www.mrgr.cn/news/55272.html

相关文章:

  • 今日头条躺赚流量:自动化新闻爬取和改写脚本
  • 从零学习大模型(一)-----GPT3(上)
  • SaaS架构:中央库存系统架构设计
  • k8s 配置私有镜像仓库认证
  • 【JavaEE初阶】深入理解TCP协议中的封装分用以及UDP和TCP在网络编程的区别
  • 如何提高外贸网站在谷歌的收录速度?
  • nginx精讲
  • vue3 非父子组件间传值代码
  • Sigrity-Power SI如何使用Model Extraction模式同时提取电源和信号网络的S参数操作指导
  • vbs给qq发送消息
  • 2024人工智能报告.zip |一文迅速了解今年的AI界都发生了什么?
  • 基于SSM的校园跑腿网站的设计与实现
  • 银行报表测试
  • 简单走近ChatGPT
  • 科隆仪表IFC300W资料下载
  • 【QT速成】半小时入门QT6之QT前置知识扫盲(超详细QT工程解析)
  • MongoDB Shell 基本命令(二)操作符
  • Sigrity-Power SI如何使用Model Extraction模式提取电源网络的S参数和阻抗操作指导(一)
  • 探索CompletableFuture:高效异步编程的利器
  • C-自定义类型-联合和枚举
  • 数据库系统
  • 插件开发流程
  • HTTP Cookie深入解析
  • 从壹开始解读Yolov11【源码研读系列】——cfg:模型配置加载功能
  • DevExpress WPF中文教程:Data Grid的视图概述及主要功能一览
  • 【源码+文档】基于SpringBoot+Vue养老院管理系统