上篇博客中提出了一个问题:怎么结束一个定时循环执行的线程,并给出了一个解决方案,但是又出现了一个问题,详细去参考上一篇博客。
然后出去撒了个尿,突然脑子里出现了一个想法(看来工作和思考久了,出去走走,哪怕是去撒个尿,都可能尿出火花,所以工作和学习的时常根本就不等同于效率灵感不是在那里拼命工作、想就能出来的),需要结合上上篇博客:关于FreeOnTerminate的知识
上面所给出的第一种解决方案:
线程(Execute)在执行定时循环;然后先让 DestroyAThread设置 Terminated属性,通知线程去结束执行、释放资源;然后在线程结束执行、释放资源之后再去通知DestroyAThread,再由DestroyAThread来显式调用线程的 Free方法来释放线程
所以结合 FreeOnTerminate的作用,复习一下:
类 Create 了就要 Free;
但 TThread(的子类) 有特殊性, 很多时候我们不能确定新建的线程什么时候执行完(也就是什么时候该释放);
如果线程执行完毕自己知道释放就好了, 所以 TThread 给了一个布尔属性 FreeOnTerminate, 如果为 True, 线程执行完毕后就会自释放.
进行改造:
首先在线程的Execute方法里面将 FreeOnTerminate设置为True,然后进行自己的定时循环执行;然后DestroyAThread设置Terminated属性,通知线程去结束执行、释放资源;然后在线程结束执行、释放资源之后,因为FreeOnTerminate设置为True了,所以就不要再通知 DestroyAThread,自己在释放完资源、结束执行之后,就会自释放。
同样DestroyAThread设置Terminated属性之后,就可以直接退出,因为不需要在DestroyAThread里面显式释放线程。
同样也就不需要线程再有 CanFree这种通知别人来释放它的属性了,所以也能简化线程类的设计(在面向对象的程序设计中一个原则就是:类尽可能小,所以那些能不需要的属性、方法就不要去定义和使用,把冗余的属性和方法一定要去掉……)
所以新的代码可以是这样的
Execute方法:
procedure TDoSomeThingThread.Execute;
var
i: Integer;
begin
inherited;
FreeOnTerminate:= True;
//CanFree := False; //不再需要 CanFree这样的属性了,也就简化了线程类的设计
try
while not Self.Terminated do
begin
........
{
在这里编写该线程具体所要做的事情的代码逻辑,
如果这里面还是要循环执行一些任务,
最好能在每次循环的时候也都再去检查一下Terminated的值
如果是True就结束循环,
就是保证在较短的事件内不断检查 Terminated标志,保证能够及时退出
}
........
Sleep(5);
Application.ProcessMessages;
end;
finally
//CanFree := True; //不再需要 CanFree这样的属性了,也就简化了线程类的设计
{在这里将线程申请的资源进行释放……后续操作}
end;
end;
DestroyAThread方法:
procedure DestroyAThread(testThread: TDoSomeThingThread); stdcall;
var
itime: Cardinal;
begin
if Assigned(testThread) then
begin
testThread.Terminate; //在这里将testThread的 Terminated属性设置为True {
这里就只需要通过Terminate方法将线程的Terminated设置为True,
去通知线程结束就行了,
不需要关心线程的释放问题,因为线程会自己释放
}
end; //这个方案中就不需要使用Free方法去显式释放线程资源了,因为线程自己会在执行结束后自动释放
end;
Delphi中怎么结束线程(这个线程是定时执行的)(方案二)的更多相关文章
-
Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……
接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...
-
Delphi中线程类TThread实现多线程编程1---构造、析构……
参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...
-
转发 Delphi中线程类TThread 实现多线程编程
Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...
-
Delphi中的线程类 - TThread详解
Delphi中的线程类 - TThread详解 2011年06月27日 星期一 20:28 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本 ...
-
Delphi中的线程类(转)
Delphi中的线程类 (转) Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对 TThread类的几个成员作一简单介绍,再说明一下 ...
-
在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)
在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程! 如果直接使用Win32的API函数CreateThread()创建多个线程,也是可以创建的.但 ...
-
C# 多线程是否结束可通过线程池可以判断
C# ManualResetEvent信号状态判断线程池是否结束 这是一段重要的代码,小猪两个小时的研究成果,记下来备查. using System; using System.Collection ...
-
VC中利用多线程技术实现线程之间的通信
当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...
-
[读书心得] .NET中 类型,对象,线程栈,托管堆在运行时的关系
.NET中 类型,对象,线程栈,托管堆 在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and ...
随机推荐
-
iOS - 适配器模式场景总结
适配器模式: 1.出现场景 TableViewCell视图层 - 输出 无论NSData怎么变化,数据都可以显示在视图层中. 2.组成结构 输入 - [适配器]- 输出 (数据层) - [适配器]- ...
-
fuck me on github
前几天写了一篇<博客园添加Fork me on GitHub彩带>,有博友评论,说他看到有的彩带上写着“Fuck me on GitHub”,当时我就笑喷了,有意思,哈哈! 昨天正好有时间 ...
-
linux下QT Creator常见错误及解决办法
最近因为在做一个关于linux下计算机取证的小项目,需要写一个图形界面,所以想到了用QT来写,选用了linux下的集成开发环境QT Creator5.5.1,但刚刚安装好,竟然连一个"hel ...
-
if..endif 语法
使用 if(); elseif(); else; endif; 这一系列复杂的语句无助于 PHP 3.0 解析器的效率.因此,语法改变为: Example#1 移植:旧有 if..endif 语法 i ...
-
(5/9)*(f-32)与5*(f-32)/9
今天在Linux下用c语言写个小程序玩玩,主要就是根据华氏温度计算摄氏温度.公式是:摄氏度=(5/9)*(华氏度-32) 代码很简单~ #include<stdio.h> main() { ...
-
非常基本的SQL 内外连接
有些问题一直很郁闷,例如:为什么会存在大约在同一时间连接这个东西.如果外键为空,创建问题的声明时,将有一个外键约束失败. 后来,在精心研究,恩.外部连接(左连接.正确的连接). 事实上都是非常基础的东 ...
-
声明式编程思想和EEPlat
声明式编程定义 声明式编程(英语:Declarativeprogramming)它是一种编程范式.程相对立.它描写叙述目目标性质,让计算机明白目标,而非流程. 声明式编程不用告诉电脑问题领域.从而避免 ...
-
VS找不到MFC90d.dll错误
VS 2005/VS 2008在生成可执行文件时使用了一种新的技术,该技术生成的可执行文件会伴随生成一个清单文件(manifest file)(.manifest后缀文件)(其本质上是XML文档,你可 ...
-
python循环
#!/usr/bin/python #coding:utf-8 lcf_age = "19" count = 0 while count < 3: c_lcf_age = i ...
-
2018.10.30 NOIP模拟 排列树(树形dp+组合数学)
传送门 考试的时候乱搞过了. 其实题目就是让你求拓扑排序方案数. 直接树形dpdpdp然后组合数转移一下就行了. 乱搞代码