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 ...
随机推荐
- web开发中会话跟踪的方法
1. 什么是会话 会话是指一个终端用户(服务器)与交互系统(客户端)进行通讯的过程. 2. 什么是会话跟踪 对同一个用户对服务器的连续的请求和接受响应的监视.(将用户与同一用户发出的不同请求之间关联, ...
- Vue知识整理14:组件基础
组件:可以复用的实例.使用 v-component来实现 2.通过props属性添加相应的属性,并且在模板中渲染 当模板中包含多个组件时,则需要用一个div来包裹起来.如下: 可以将原来的的点击事件, ...
- java8 查找字符串中首次出现2次的字母
利用java8的stream函数式编程进行处理 1.实现字母分离 map将整个字符串当成一个单词流来处理 Map<String[], Long> collect14 = Stream.of ...
- 【SpringMVC】---搭建框架步骤
项目如下 一.加入 Jar 包 部分jar包可以不导(第4.9.11个可以不导入) 二.在 Web.xml 中配置 DispatcherServlet <?xml version="1 ...
- GCC 使用-C语言编译过程
任何一种高级语言,要想在机器上执行,必须翻译为机器能读懂的机器语言.编译器就相当于翻译官,将高级语言翻译为机器语言. GCC 最初只用了编译 C 语言程序,全称是 GNU C Compiler.后来扩 ...
- ES6标准入门 第五章:数值的扩展
1.二进制和八进制数值表示法 二进制前缀:0b(或0B): 八进制前缀:0o(或0O). 注意:ES5的严格模式 和 ES6中不再允许使用 0 表示八进制. 将二进制和八进制数值转换为十进制数值 ...
- C++:利用如下公式,编写函数计算∏的值,直到最后一项的绝对值小于e,主程序接收从键盘输入的e,输出∏的值(保留5位小数)。 ∏/4 = 1-1/3+1/5-1/7...
利用如下公式,编写函数计算∏的值,直到最后一项的绝对值小于e,主程序接收从键盘输入的e,输出∏的值(保留5位小数). ∏/4 = 1-1/3+1/5-1/7... #include <iostr ...
- java基础/数据加解密(Mooc)
一.消息摘要算法 常用摘要算法: 以下 (HEX)内容:bc指Bouncy Castle | cc指:Apache commons Codec 1.消息摘要算法MD5及MD族(MD2,MD4) 消 ...
- 决解nginx代理的django项目的admin站点无法访问,和没样式的问题。
首先我们先解决无法访问admin站点的问题 首先我们先修改一下nginx的配置,添加红色框框的部分. 然后重新启动一下nginx 访问一下admin站点 发现没有样式了. 我们先修改/fast_foo ...
- [2019徐州网络赛J题]Random Access Iterator
题目链接 大致题意:从根节点出发,在节点x有son[x]次等概率进入儿子节点,求到达最深深度的概率.son[x]为x节点的儿子节点个数. 又又又又没做出来,心态崩了. 下来看了官方题解后发觉自己大体思 ...