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 ...
随机推荐
- 前后端分离&接口API设计学习报告
接口API设计学习报告 15331023 陈康怡 什么是API? API即Application Programming Interface.API是一种通道,负责一个程序与另一个程序的沟通.而对于w ...
- Java中判断两个列表是否相等
CollectionUtils.isEqualCollection(final Collection a, final Collection b) CollectionUtils工具类中有一个查看两个 ...
- 【Spring】---【IOC入门案例】
第一步:导入Jar包 第二步:创建类,在类里面创建方法 public class User { public void add(){ System.out.println("-------- ...
- pg和mysql对比
作者:方圆链接:https://www.zhihu.com/question/20010554/answer/15863274来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- 学了一天的golang从入门到放弃
Google的go就是个二货,不实用,它最多只能和c比简单.low!
- ---Mock---基本使用
一.mock解决的问题 开发时,后端还没完成数据输出,前端只好写静态模拟数据.数据太长了,将数据写在js文件里,完成后挨个改url.某些逻辑复杂的代码,加入或去除模拟数据时得小心翼翼.想要尽可能还原真 ...
- C# 编写的webservice 怎样返回XML数据
[WebMethod] public string GetXml() { string sConStr = ConfigurationManager.ConnectionStrings["c ...
- mysql 恢复数据时中文乱码
mysql恢复数据时中文乱码,解决办法. 用source命令导入mysql数据库怎么设置中文编码 1.导出数据时指定编码在导出mysql sql执行文件的时候,指定一下编码格式: mysqldump ...
- 自己写一个Layout
1 Layout是ViewGroup的子类 LinearLayout.FrameLayout都是ViewGroup的子类,自己写的Layout也是ViewGroup的子类. 2 步骤 第一,自己的La ...
- Linux cat 多行写入文件防止变量替换
Linux cat 多行写入文件防止变量替换 问题描述 对多个变量及多行输出到文件,存在变量自动替换,当使用cat<<EOF不想对内容进行变量替换.命令替换.参数展开等 问题解决 转义特 ...