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,虽然整个程序写得还算比较顺利,但写完 ...
随机推荐
- 我对微服务、SpringCloud、k8s、Istio的一些杂想
一.微服务与SOA “微服务”是一个名词,没有这个名词之前也有“微服务”,一个朗朗上口的名词能让大家产生一个认知共识,这对推动一个事务的发展挺重要的,不然你叫微服务他叫小服务的大家很难集中到一个点上. ...
- 如何使用 nvm-windows 管理 nodejs 版本
写在前边的话: (1). 路径一定不要包含空格,如 Program Files 这样,所以有把程序安装到 D:\Program Files 文件下的同学请注意了:(2). 为了避免 nvm 无法切换源 ...
- ThreadPoolExecutor带来的性能问题
使用线程池,一般情况下会带来性能提升,并且使用线程池管理线程,减少了每个任务调用的开销,通常可以在执行大量异步任务时提供增强的性能. 但是在高并发的情况下,会因为使用不当导致性能下降,并且下降得比较严 ...
- 用ECharts绘制Prometheus图表,实现类似Grafana的自定义Dashboard
大家一般都是用Grafana自定义Dashboard来监控Prometheus数据的,作者这次尝试用ECharts来绘制Prometheus数据图表,一方面可以减少依赖,另一方面可以将监控界面灵活 ...
- Java核心技术(卷一)读书笔记——第二章(JAVA/JDK环境配置)
JDK 配置:自行百度. 存在多个JDK 版本并且需要指定某版本时,注意更改注册表JavaSoft项以及相关子项,同时删除system32目录下相关的Java可执行文件xxx.exe. IDEA打开项 ...
- Eclipse 设置黑色主题
Eclipse 设置为黑色主题,不仅看起来炫酷,更重要的是对于长期盯着电脑的程序猿来说对眼睛更好些. 先看下效果: 下面以Eclipse Luna 为例,说说 Eclipse 设置为黑色主题的方法(P ...
- 快速安装k8s,版本为1.13.8
利用rpm快速部署k8s #!/bin/bash #快速安装k8s #by love19791126 107420988@qq.com pwd=$(pwd) masteripaddr=#(ip a s ...
- Zabbix 中使用 Percona Monitoring Plugins 监控 MySQL
1.先安装agent客户端 tar zxvf zabbix-3.2.6.tar.gz cd zabbix-3.2.6 ./configure --prefix=/data/zabbix --enabl ...
- js数组排序 多条件
按照[次数]和[时间]排序,选择次数最多的排在前面,同样次数的情况下时间较新排在前面. 原始数据: var arr= [ {name:'qqq', num:2,time:'2015-06-08 13: ...
- 常用css选择器以及选择器的权重值介绍
一.选择器的权重值 选择器权重值比较: !important infinity 无穷大 行间样式 1000 id ...