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,虽然整个程序写得还算比较顺利,但写完 ...
随机推荐
- Android的简述
程序截图 先来简单了解下程序运行的效果 程序入口点 类似于win32程序里的WinMain函数,Android自然也有它的程序入口点.它通过在AndroidManifest.xml文件中配置来指明, ...
- Angular JS 中的内置方法之filter
通过过滤器可以实现很多数据格式化的功能 常用方法形如{{ data | uppercase}} 或者是{{ 123.456 | number:2 }} 也可以通过在控制器中注入$filter来实现功能 ...
- JAVA并发之阻塞队列浅析
背景 因为在工作中经常会用到阻塞队列,有的时候还要根据业务场景获取重写阻塞队列中的方法,所以学习一下阻塞队列的实现原理还是很有必要的.(PS:不深入了解的话,很容易使用出错,造成没有技术深度的样子) ...
- codeforces 576 div2 A-D题解
A题 Description 题目链接: https://codeforces.com/contest/1199/problem/A 题意: 给定长度为n(1≤n≤100000)的一个序列a,以及两个 ...
- 基于python的Elasticsearch索引的建立和数据的上传
这是我的第一篇博客,还请大家多多指点 Thanks ♪(・ω・)ノ 今天我想讲一讲关于Elasticsearch的索引建立,当然提前是你已经安装部署好Elasticsearch. ok ...
- C#开发可播放摄像头及任意格式视频的播放器
前言 本文主要讲述,在WPF中,借助Vlc.DotNet调用VLC类库,实现视频播功能,下面我们先来做开发前的准备工作. 准备工作 首先,我们创建一个项目WpfVLC,然后,进入Neget搜索Vlc. ...
- Java +支付宝 +接入+最全+最佳-实战-demo
一.支付宝配置: 1.需要在支付宝商户平台购买支付的产品并开通支付. 2.购买支付产品登录支付宝:https://auth.alipay.com/login/index.htm 3.登录之后首页点击查 ...
- 【C++】string::find函数
int vis=a.find(b):从string a开头开始查找第一个遇到的string b,返回string a中所匹配字符串的第一个字符的下标位置,找不到则返回-1. int vis=a.fin ...
- Vue项目中使用better-scroll
当 better-scroll 遇见 Vue 在我们日常的移动端项目开发中,处理滚动列表是再常见不过的需求了. 以滴滴为例,可以是这样竖向滚动的列表,如图所示: 也可以是横向滚动的导航栏,如图所示 ...
- postman->newman->jenkins构建过程的问题记录及解决方法
从postman导出请求集合后要做的工作: 需要调整导出的json文件,如配置环境变量{{host}},需要修改成准确的url; 通过newman执行newman run test_request.j ...