Delphi - Indy TIdThreadComponent 线程研究
Indy IdThreadComponent 线程研究
前几天在开发数据实时解析功能模块的时候,发现解析数据量巨大,特别耗时,程序一跑起来界面假死。
为了优化用户体验,采用了Indy 自带的IdThreadComponent控件,完美的解决了此问题。
下面就IdThreadComponent一些关键属性和方法做如下记录:
1:IdThreadComponent属性
这里主要记录一下Active、Priority和StopMode属性。
Active:默认False,当需要令IdThreadComponent控件生效时,置为True;
Priority:为避免线程之间相互冲突,选择Normal,让系统自带分配优先级;
StopMode:这里分为Terminate和Suspend两种,Terminate为强行终止,Suspend为延缓、等待终止。

2:IdThreadComponent方法
TIdThreadComponent用的是观察者模式,所有这里的事件都是回调事件。
一般比较耗时的操作放在OnRun中执行。
事件执行顺序如下:
On Before Execute;
On Before Run;
On Run;
On Stopped;
On After Run;
On After Execute;

3:通过如下Demo进行说明
需要说明一下:
在线程里不可以直接操作界面上的控件,因为有时候控件被销毁了而线程还在运行,这时直接操作会抛AV异常,所以在TIdThreadComponent回调事件中,如果有使用到控件的,必须先做控件是否为空的判断。
界面如下:

代码如下:
unit uMain; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, RzButton, StdCtrls, RzEdit, IdBaseComponent, IdThreadComponent; type
TMainFrm = class(TForm)
IDTrd: TIdThreadComponent;
mmMsg: TRzMemo;
btnStart: TRzBitBtn;
btnStop: TRzBitBtn;
btnTerminal: TRzBitBtn;
procedure btnStartClick(Sender: TObject);
procedure IDTrdRun(Sender: TIdCustomThreadComponent);
procedure IDTrdBeforeExecute(Sender: TIdCustomThreadComponent);
procedure IDTrdAfterExecute(Sender: TIdCustomThreadComponent);
procedure btnStopClick(Sender: TObject);
procedure btnTerminalClick(Sender: TObject);
procedure IDTrdAfterRun(Sender: TIdCustomThreadComponent);
procedure IDTrdBeforeRun(Sender: TIdCustomThreadComponent);
procedure IDTrdStopped(Sender: TIdCustomThreadComponent);
private
{ Private declarations }
public
{ Public declarations }
end; var
MainFrm: TMainFrm; implementation {$R *.dfm} procedure TMainFrm.btnStartClick(Sender: TObject);
begin
IDTrd.Active := True;
end; procedure TMainFrm.IDTrdRun(Sender: TIdCustomThreadComponent);
var
I: Integer;
begin
for I := to do
begin
mmMsg.Lines.Add(IntToStr(I)); //模拟耗时操作
end;
//在线程里不可以直接操作界面控件,有时候控件被销毁了而线程还在运行,
//此时就会报AV异常,
//所以在TIdThreadComponent回调事件中有使用到控件的,必须添加控件是否为空判断
end; procedure TMainFrm.IDTrdBeforeExecute(Sender: TIdCustomThreadComponent);
begin
if Assigned(mmMsg) then
begin
mmMsg.Lines.Add('Before Execute');
end;
end; procedure TMainFrm.IDTrdAfterExecute(Sender: TIdCustomThreadComponent);
begin
if Assigned(mmMsg) then
begin
mmMsg.Lines.Add('After Execute');
end;
end; procedure TMainFrm.btnStopClick(Sender: TObject);
begin
IDTrd.Stop;
end; procedure TMainFrm.btnTerminalClick(Sender: TObject);
begin
IDTrd.Terminate;
end; procedure TMainFrm.IDTrdAfterRun(Sender: TIdCustomThreadComponent);
begin
if Assigned(mmMsg) then
begin
mmMsg.Lines.Add('After Run');
end;
end; procedure TMainFrm.IDTrdBeforeRun(Sender: TIdCustomThreadComponent);
begin
if Assigned(mmMsg) then
begin
mmMsg.Lines.Add('Before Run');
end;
end; procedure TMainFrm.IDTrdStopped(Sender: TIdCustomThreadComponent);
begin
if Assigned(mmMsg) then
begin
mmMsg.Lines.Add('On Stopped');
end;
end; end.
作者:Jeremy.Wu
出处:https://www.cnblogs.com/jeremywucnblog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Delphi - Indy TIdThreadComponent 线程研究的更多相关文章
- Delphi indy线程控件TIdThreadComponent的使用
当程序需要做耗时操作,例如访问数据库获取较多的数据.获取大文件MD5.网络访问数据量比较大.界面需要频繁刷新等等,都可以用线程来解决界面卡顿的问题,从而优化用户体验. 在知道TIdThreadComp ...
- Delphi中的线程类 - TThread详解
Delphi中的线程类 - TThread详解 2011年06月27日 星期一 20:28 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本 ...
- Delphi中的线程类(转)
Delphi中的线程类 (转) Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对 TThread类的几个成员作一简单介绍,再说明一下 ...
- [delphi]indy idhttp post方法
网易 博客 LOFTCam-用心创造滤镜 LOFTER-最美图片社交APP 送20张免费照片冲印 > 注册登录 加关注 techiepc的博客 万事如意 首页 日志 LOFTER 相册 音乐 ...
- [Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究
[Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究,目前MFC存在问题,win32没问题. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的Sc ...
- 在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)
在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程! 如果直接使用Win32的API函数CreateThread()创建多个线程,也是可以创建的.但 ...
- Delphi Indy IDHttp 403 forbidden
http://hbk777.blog.163.com/blog/static/6058086200681594333361/ Delphi Indy IDHttp 403 forbidden 2006 ...
- delphi 读网页线程TReadHtmlThread
读网页,通常是一个耗时操作.故把读网页放入线程是显得比较重要了. 本例用改进后的 TIdhttpEx 加上线程来实现读网页. 它的父类TSimpleThread 在此 本例程源码在此 源码中包含了所有 ...
- Delphi 中 COM 实现研究手记(一)
前言 前些日子用 Delphi 写了一个 Windows 外壳扩展程序,大家知道 Windows 外壳扩展实际上就是 COM 的一种应用 -- Shell COM,虽然整个程序写得还算比较顺利,但写完 ...
随机推荐
- static import和import的区别
import static静态导入是JDK1.5中的新特性.一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....Cl ...
- 12. 集合类Collection和Map
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- java连接mysql数据库jdbc
jdbc.driver = com.mysql.jdbc.Driverjdbc.url = jdbc:mysql://localhost:3306/数据库名jdbc.username = rootjd ...
- 金蝶K3 V12.2版本,中途启用双计量单位出现错误
忘记修改虚仓库存/收料通知单的双计量数量
- Mysql优化(出自官方文档) - 第五篇
目录 Mysql优化(出自官方文档) - 第五篇 1 GROUP BY Optimization 2 DISTINCT Optimization 3 LIMIT Query Optimization ...
- SQLServer2000同步复制技术实现步骤
SQLServer2000同步复制技术实现步骤 一. 预备工作 1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户 --管理工具 --计算 ...
- xml的四种解析方式(转载)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- jquery 动态载入页面,并且保证 url 变动
最近做一个新的项目,项目页头,导航,页尾是不变的,只有中间部分是通过加载其他页面,达到内容刷新的. 大概结构如下, 要求, 1. 正文部分可以通过加载一个页面达到刷新效果 2. 保留加载的页面 url ...
- excel 导入 下载模板 demo
import org.apache.commons.beanutils.PropertyUtils;import org.apache.commons.lang3.StringUtils;import ...
- xpath定位的一些方法