Delphi--长线程
{
长线程,
开启:随应用程序启用而启动
关闭:岁应用程序关闭而结束
}
unit uLongThread;
interface
uses
Classes, ADODB, DB, ActiveX, SysUtils;
type
//线程状态,空闲、繁忙、异常、外部终止
TThreadStatus = (tsIdle, tsBusy, tsException, tsTerminate);
type
TLongThread = class(TThread)
private
FState: TThreadStatus;
FSleepTimes: Integer;
{************************************分割线,上面是变量定义,下面是方法集合********************************************}
//线程休眠
function SetThreadSleep(aInterval: Integer): Boolean;
//线程创建时初始化
procedure InitOnCreate(aConn: TADOConnection; aSleepTimes: Integer);
//线程结束时销毁对象
procedure DoOnDestroy;
//线程实际执行体
procedure Executed;
{************************************分割线,上面是公用方法,下面是具体的业务代码********************************************}
protected
procedure Execute; override;
public
constructor Create(aConn: TADOConnection; aSleepTimes: Integer = );
destructor Destroy; override;
published
//线程状态
property ThreadStatus: TThreadStatus read FState write FState;
//线程定时间隔时间,即休眠时间
property ThreadSleepTimes: Integer read FSleepTimes write FSleepTimes;
end;
implementation
{ TLongThread }
constructor TLongThread.Create(aConn: TADOConnection; aSleepTimes: Integer);
begin
InitOnCreate(aConn, aSleepTimes);
inherited Create(False);
end;
destructor TLongThread.Destroy;
begin
DoOnDestroy;
inherited;
end;
procedure TLongThread.DoOnDestroy;
begin
end;
procedure TLongThread.Execute;
begin
//延时一点时间执行,先让主窗体显示出来
SetThreadSleep();
CoInitialize(nil);
try
while not Terminated do
begin
FState := tsBusy;
//核心方法
Executed;
//保证CPU释放
Sleep();
//下面这一句判断十分有必要,如果上面执行体运行很久,期间外部中止线程。
//缺少这一句控制,会在执行体结束后立即进入休眠期,这样外部控制此时无效。有漏洞
if FState = tsTerminate then
begin
Self.Terminate;
Break;
end;
//线程进入休眠期,等待下一次唤醒
FState := tsIdle;
if not SetThreadSleep(FSleepTimes) then
begin
Self.Terminate;
Break;
end;
end;
finally
CoUninitialize;
end;
end;
procedure TLongThread.Executed;
begin
end;
procedure TLongThread.InitOnCreate(aConn: TADOConnection; aSleepTimes: Integer);
begin
FSleepTimes := aSleepTimes;
//默认空闲
FState := tsIdle;
end;
function TLongThread.SetThreadSleep(aInterval: Integer): Boolean;
var
SlpTicket: Cardinal;
n: Integer;
begin
Result := True;
//直接间隔N秒,不考虑线程执行体中的函数执行时间
SlpTicket := aInterval * ;
n := SlpTicket div ; //每100毫秒执行一次循环
while n > do
begin
Sleep();
Dec(n);
if FState = tsTerminate then
begin
Result := False;
Exit;
end;
end;
end;
end.
调用方法
//创建线程
if not Assigned(fLongThread) then
begin
fLongThread := TLongThread.Create(ADOConnection1, );
//do something
end;
销毁线程
//结束线程
if Assigned(fLongThread) then
begin
fLongThread.ThreadStatus := tsTerminate;
fLongThread.WaitFor;
FreeAndNil(fLongThread);
end;
长线程, 开启:随应用程序启用而启动 关闭:岁应用程序关闭而结束 应用场景: 一般用于后台长期开启,我个人的主要用途是做上传下载。
Delphi--长线程的更多相关文章
- 转:学习笔记: Delphi之线程类TThread
学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...
- java线程池之newFixedThreadPool定长线程池
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待. 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根 据系统的环境情况,可以 ...
- Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……
接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...
- 转发 Delphi中线程类TThread 实现多线程编程
Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...
- delphi 在线程中运行控制台命令(console)
在编程开发的时候,我们时常会调用windows本身的功能,如:检测网络通断,连接无线wifi等. 虽然,用 windows api 操作可以完美地完成这些操作,但是,函数参数太难了.令人望而生畏,不是 ...
- 学习笔记: Delphi之线程类TThread
新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...
- delphi 一个线程和主界面的交互的演示代码
求一个线程和主界面的交互的演示代码求一个线程和主界面的交互的演示代码.线程和主界面处于两个Unit.线程中的user中不能引用主窗口.我只是想学习一下,线程和主界面交互的方法.去网上查了好几天资料,能 ...
- Delphi中线程类TThread实现多线程编程1---构造、析构……
参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...
- Delphi ThreadPool 线程池(Delphi2009以上版本适用)
http://blog.sina.com.cn/s/blog_6250a9df0101kref.html 在网上查找Delphi线程池,结果发现寥寥无几. 看了半天源代码,弄得一头雾水,觉得不容易理解 ...
- delphi中线程应用之Synchronize
当一个线程在使用时,如果这个函数使用了Synchronize修钸的话就不允许别一个线程来调用这个函数,它的目的是避免多个子线程同时访问主线程资源.示例:procedure TTaskThread.Sh ...
随机推荐
- 求旋转数组的最小数字(剑指offer)
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...
- svn访问版本库时一直提示: please wait while the repository browser is initializing
最近不知道做了什么操作,原来正常的SVN Check In/Out都无法正常操作. 正常Check In的动作,几秒钟就会操作完成,但是我却等了好久好久,然后提示Connection timed ou ...
- CDS究竟是个什么鬼?它直接导致了次贷危机?
周五,中国银行间市场交易商协会就确认了这一消息,信用违约互换(CDS)和信用联结票据(CLN)业务指引在今日正式发布实行. 当然,这则消息在中国普通投资者当中还没引起足够关注,但是在很多人看来CDS这 ...
- numpy添加新的维度
原文链接:https://blog.csdn.net/xtingjie/article/details/72510834 numpy中包含的newaxis可以给原数组增加一个维度 np.newaxis ...
- jeecg项目将workbook 的Excel流添加到zip压缩包里导出
1.直接献出代码 Map<String,List<ConfidentialInformation>> typeMap = new HashMap<>(); try ...
- 指定pom文件jdk版本
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...
- vue router应用及总结
编写一个小的demo,对router基础的应用学习和理解. 效果图示: 说明: 点击About在右边显示相关信息. 说明: 点击Home,在下边显示相关信息,且Home下有两个路由链接,分别对应各自的 ...
- 1、Java语言概述与开发环境——Java特性和技术体系平台
一.Java语言的主要特性 1.Java语言是易学的: Java语言的语法与C语言和C++语言很接近,使得大多数的程序员很容易学习和使用Java. 2.Java语言是强制面向对象的: Java语言提供 ...
- E - 盒子游戏
有两个相同的盒子,其中一个装了n个球,另一个装了一个球.Alice和Bob发明了一个游戏,规则如下:Alice和Bob轮流操作,Alice先操作每次操作时,游戏者先看看哪个盒子里的球的数目比较少,然后 ...
- 在Visual studio 2017中使用EF6连接MySQL
在Visual studio 2017中使用EF6连接Mysql ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) ...