当程序需要做耗时操作,例如访问数据库获取较多的数据、获取大文件MD5、网络访问数据量比较大、界面需要频繁刷新等等,都可以用线程来解决界面卡顿的问题,从而优化用户体验。

在知道TIdThreadComponent之前,建立线程一般都使用继承TThread复写execute过程或者使用createthread。继承TThread写的代码要多一点,createthread又不方便控制线程,于是就有了TIdThreadComponent,集两者的优点,只要拖个控件,线程就出来了。

TIdThreadComponent用的是观察者模式(就是回调),提供以下几个事件回调:

OnAfterExecute;  //线程Execute过程执行完成
    OnAfterRun; //线程循环执行体完成(不明白的下面看了原理就能明白)
    OnBeforeExecute;//线程Execute过程执行之前
    OnBeforeRun;//线程循环执行体之前(不明白的下面看了原理就能明白)
    OnCleanup;
    OnException;
    OnRun;//执行体
    OnStopped;
    OnTerminate;

原理如下,下图是为了方便理解使用,忽略了一些不常用的细节,例如OnStopped;OnCleanup;事件的回调时机,有兴趣的可以查看控件源码,熟悉线程的同学应该都能看懂并理解源码。

onRun会被重复执行,直到调用控件的stop过程或Terminate过程;

before前缀的回调事件多用于初始化工作,一般建议使用beforeExecute;

after前缀的回调事件多用于释放内存操作,一般建议使用afterExecute;

控件提供stop函数和Terminate函数,进行对线程的停止操作,届时会触发并回调onstop、onTerminate事件,需要结束线程时,建议使用stop函数或active:=false;

控件的使用

前提需要安装indy系列,我用的是indy9(我尝试过在Delphi2010上使用indy10,beforeRun和afterRun的触发时机有点不一样)

1.把TIdThreadComponent控件拖到窗体上

2.根据业务需求,在相应的回调事件中写业务处理代码

3.TIdThreadComponent.active := true 开始执行

4.执行效果

在onRun中模拟耗时操作,在onRun执行耗时操作时,界面没有被卡死,依然可以流畅拖动,做其它事情

onRun事件处理代码

beforeExecute、afterExecute执行的代码:

start按钮和stop按钮执行的代码

这样,一个线程操作就完成了,非常的方便。

TIdThreadComponent还提供了设置线程优先级,这些就不做介绍了。

注意:

在线程里直接操作界面控件是一件危险的事情,有时候控件被销毁了而线程还在运行,此时就会报AV异常,所以在TIdThreadComponent回调事件中有使用到控件的,必须添加控件是否为空判断,例如我代码里写到的

否则,在TIdThreadComponent线程运行期间,关闭窗体会造成异常。

当然你可以使用消息来处理,但消息参数handle要用变量保存,否则也会报错。

注意2:

如果TIdThreadComponent没有开启(即没有active:=true或start),直接TIdThreadComponent.Terminate会出异常,而TIdThreadComponent.stop不会

Delphi indy线程控件TIdThreadComponent的使用的更多相关文章

  1. Handler机制来处理子线程去更新UI线程控件

    public class HandlerTestActivity extends Activity { private TextView tv; private static final int UP ...

  2. C# 跨线程访问或者设置UI线程控件的方法

    一.背景 在C#中,由于使用线程和调用UI的线程属于两个不同的线程,如果在线程中直接设置UI元素的属性,此时就会出现跨线程错误. 二.问题解决方法 使用控件自带的Invoke或者BeginInvoke ...

  3. Delphi - Indy TIdFTP控件实现文件的上传和下载

    FTP信息保存和获取 我们在做FTP相关开发时,为方便后续FTP切换,一般先把FTP账户信息保存到数据库表中,在使用时再通过Query获取出来. 一般通过如下方式获取到FTP相关信息,代码如下: // ...

  4. [delphi]indy idhttp post方法

    网易 博客 LOFTCam-用心创造滤镜 LOFTER-最美图片社交APP 送20张免费照片冲印 > 注册登录  加关注 techiepc的博客 万事如意 首页 日志 LOFTER 相册 音乐 ...

  5. 在Winform开发中使用日程控件XtraScheduler(2)--深入理解数据的存储

    在上篇随笔<在Winform开发中使用日程控件XtraScheduler>中介绍了DevExpress的XtraScheduler日程控件的各种使用知识点,对于我们来说,日程控件不陌生,如 ...

  6. 在Winform开发中使用日程控件XtraScheduler

    在一些应用场景中,我们可能需要记录某一天,某个时段的日程安排,那么这个时候就需要引入了DevExpress的日程控件XtraScheduler了,这个控件功能非常强大,提供了很好的界面展现方式,以及很 ...

  7. Delphi连接Oracle控件ODAC的安装及使用(轉載)

     Delphi连接Oracle控件ODAC的安装及使用 2010-08-13 01:13:37 标签:Oracle Delphi 控件 休闲 ODAC 原创作品,允许转载,转载时请务必以超链接形式标明 ...

  8. zw版【转发·台湾nvp系列Delphi例程】Delphi 使用 HALCON库件COM控件数据格式转换

    zw版[转发·台湾nvp系列Delphi例程]Delphi 使用 HALCON库件COM控件数据格式转换 Delphi 使用 HALCON库件COM控件数据格式转换,与IHObjectX接口有关 va ...

  9. Delphi的TListView控件拖放选定行操作

    http://www.tansoo.cn/?p=401 Delphi的TListView控件拖放选定行操作的例子,效果图如下:TListView控件拖动选定行到指定位置 具体实现步骤: 一.新建一个D ...

随机推荐

  1. 接触node第一步

    趁着工作不忙,今天来系统记录一下安装node环境: 1.node下载地址为:https://nodejs.org/en/,检查是否安装成功:如果输出版本号,说明我们安装node环境成功:node -v ...

  2. Spring Cloud Zuul 中文文件上传乱码

    原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...

  3. cent OS 7查询IP

    环境: win7旗舰版 VMware Workstation Pro (虚拟机软件) CentOS-7-x86_64-DVD-1804.iso 安装时选择了默认配置,最小系统安装. 安装好后用  if ...

  4. domain

    babibobucecicudadedidufafugeguhehujijukakekulalelilumimomunapapipopuqiqurerirusasesisutatetituwawowu ...

  5. 【mac微信小助手】WeChatPlugin使用教程!

    微信小助手 mac版集微信防撤回和微信多开等诸多功能于一身,可以有效的阻止朋友微信撤回消息,还能开启无手机验证登录,再也不用每次登录扫码验证啦,非常方便!   wechatplugin mac版安装教 ...

  6. 关于Java多线程的一些常考知识点

    前言 Java多线程也是面试中经常会提起到的一个点.面试官会问:实现多线程的两种方式以及区别,死锁发生的4个条件以及如何避免发生死锁,死锁和活锁的区别,常见的线程池以及区别,怎么理解有界队列与无界队列 ...

  7. 【题解】Luogu P4381 [IOI2008]Island

    原题传送门 题意:求基环树森林的直径(所有基环树直径之和) 首先,我们要对环上所有点的子树求出它们的直径和最大深度.然后,我们只用考虑在环上至少经过一条边的路径.那么,这种路径在环上一定有起始点和终点 ...

  8. 0 vs null

    看图说话 0 如图所示: 0 表示有纸(值), 但是纸(值)是0. 所以取纸(值)的时可以取, 但是没法用. null 如图所示: null 表示没有纸(值), 是真的啥都没有, 现在你抽纸的时候会出 ...

  9. Star in Parentheses

    问题 A: Star in Parentheses 时间限制: 1 Sec  内存限制: 128 MB 题目描述 You are given a string S, which is balanced ...

  10. 解决 scapy “NameError: global name 'wrpcap' is not defined” 错误

    解决 scapy "NameError: global name 'wrpcap' is not defined" 错误 通过 scapy 编写发包脚本时遇到如下错误: Trace ...