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 ...
随机推荐
- webpack4常用片段
webpack 4常用 初始化 npm init // Webpack 4.0以后需要单独安装 npm install webpack webpack-cli --save-dev 基础的config ...
- ubuntu通过windows下的ccproxy代理上网
网上教程很多,需要注意的是将ubuntu的ip和windows的Ip设置到同一个网段,即子网掩码是1的对应的部分要相同.由于没有配置到同一个网段,折腾了我好久.
- day65—angularJS的学习笔记1
转行学开发,代码100天—2018-05-20 AngularJS的引用示例: <!DOCTYPE html> <html> <head> <title> ...
- JAVA中对null进行强制类型转换(null可以强转为任意对象,并执行对象的静态方法)
今天很好奇,对null进行强转会不会抛错.做了如下测试得到的结果是, 如果把null强转给对象,是不会抛异常的,本身对象是可以为null的. 但是如果是基本类型,比如 int i = (Integer ...
- Selenium学习之==>Xpath使用方法
一.什么是Xpath XPath是XML的路径语言,通俗一点讲就是通过元素的路径来查找到这个标签元素. 工具 Xpath的练习建议大家安装火狐浏览器后,下载插件,FireBug.由于最新版火狐不再支持 ...
- cocos2dx基础篇(12) 编辑框之一CCTextFieldTTF
前面我们讲了精灵贴图.标签.菜单.按钮.感觉似乎少了点什么?UI控件里是不是应该还有一个很重要的控件--编辑框.在手机网游中,启动游戏,过了开场动画后,基本上显示的第一个界面应该就是游戏的登录界面了吧 ...
- DOM练习(邓邓版)
先来图片: 今天直接粘代码: 下面是html: <h4>01.图片切换</h4> <img width = "100" src = "../ ...
- Github 上 Star 最多的个人 Spring Boot 开源学习项目(三)
网上连载了 Spring Boot 系列文章 这个开源项目就是 spring-boot-examples ,这是一个专注帮助初学者学习 Spring Boot 的开源项目,里面分享了各种场景下 Spr ...
- python面试题--初级(二)
基础不牢,地动山摇,面试的时候经常会被问到一些平时基础的很容易被忽视的知识点,所以重在积累,多看多背深入理解,才能在某一天工作中豁然开朗恍然大悟. 面试题不仅仅为了应付面试,更是知识点的一个梳理总结归 ...
- RocketMQ事务性消息及持久化
TransactionProducer(事务消息): 在分布式系统中,我们时常会遇到分布式事务的问题,除了常规的解决方案之外,我们还可以利用RocketMQ的事务性消息来解决分布式事务的问题.Rock ...