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 ...
随机推荐
- 如何复制CSDN上他人的博客文章到自己博客下
原作者:hello_world!(CSDN) 原文地址:https://jingyan.baidu.com/article/0964eca24e159c8285f53618.html</a> ...
- spotlight监控mysql性能
spotlight可以监控mysql性能,同监控linux一样配置 目录 1.安装spotlight 2.参数认识 1.安装spotlight spotlight不仅仅只是监控mysql,还可以完成数 ...
- Python学习之==>操作Redis
一.redis简介 1.非关系型数据库 2.数据全部是存在内存里面 3.性能非常好,每秒支持30w次读写 4.可以通过备份数据库,把数据存到磁盘上来实现数据的持久化 二.操作redis 1.strin ...
- 配置idea中类头注释中的 ${user} 自动获取电脑的名字,怎么去修改名字
在idea安装路径下找到 idea\IntelliJ IDEA 2018.3.2\bin下面有一个文件叫:idea64.exe.vmoptions 编辑此文件就能修改主时钟自动获取的名称: 例如:添加 ...
- tensorflow2.0 numpy.ndarray 与tenor直接互转
1.代码参考 import numpy as npimport tensorflow as tf a = np.random.random((5,3)) b = np.random.randint(0 ...
- 更新代码 出现 You need to upgrade the working copy first 错误
今天更新了Eclipse的subclipse插件,更新代码报如下错误: svn: The working copy at 'E:\591woospace\kst_fashion_alipay_v1.2 ...
- 比较css中单位px,em和rem的区别
国内的设计师大都喜欢用px,而国外网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢? px特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原 ...
- [转帖]Docker从入门到动手实践
Docker从入门到动手实践 https://www.cnblogs.com/nsky/p/10853194.html dockerfile的图很好呢. 但是自己没有做实验 , 其实知识都挺好. do ...
- Kubernetes服务部署解决方案
学习了K8S的基础知识,我们的目的就是解决我们服务的迁移,那么接下去通过几个案例来感受一下K8s部署带来的便捷与效率. 环境准备: 3个节点,然后我这边也安装了 Ingress. 部署wordpres ...
- windows 2012 r2如何开启远程桌面
windows 2012 r2如何开启远程桌面 编写人:左丘文 2019-7-6 Windows 2012安装完成后需要开启远程桌面才可以远程连接,网上搜索了一下,有以下几个解决办法,虽说最后还是自己 ...