delphi.thread.线程循环执行体结构
线程话题太大,又都是些坑,不知从哪方面讲起,所以,想一出是一出了。
不管怎样,我们从开始使用D,不管有没有用线程,其实它已经帮我们做了一个最完整的线程执行处理:Application.Run.
这行App.Run,在dpr,想来各位都经常能够看到,如果跟踪下去,我们就会发现,它其实就是一个最完整的线程执行体的结构了:
我将里面一些代码删除掉了,再将HandleMessage的代码复制过来,然后,代码如下:
procedure TApplication.Run;
var
Msg: TMsg;
begin
repeat
try
if not ProcessMessage(Msg) then Idle(Msg);
except
HandleException(Self);
end;
until Terminated;
end;
好了,我们不用去看里面代码意思,因为从代码意思来讲,它思路很简单,而且此文,也不是要去分析介绍App的代码。
这个Run,其实给我们介绍了一个线程执行体的大体结构思路,我觉得有意思的就是这循环体结构了。
上述的APP循环执行体,大体思路是:
1: 调用消息处理();
2: 没消息,就做空闲处理();
3: 不中断程序就继续循环。
这循环结构,我觉得与线程操作大体思路是相符的。那么,它也是可以看成是线程循环执行结构了:
procedure TMyThread.Execute();
begin
repeat
try
if not DoThreadJob() and not DoThreadIdle() then
Sleep();
except
on E: Exception do
DoHandleException(E);
end;
until Terminated;
end;
当然,未有作业时,Sleep进行阻塞及切换线程时,可以弄个计数,累计idle的次数,到了一定次数后,再进行sleep,计数再复位。
如下示例:
procedure TMyThread.Execute();
const
// 根据线程服务性质,进行设定,或进行外部配置
// MAX_IDLE值越大,表示该线程的处理需要越多时间(切换次数越少),
// MAX_IDLE值越小,线程切换次数越多。
MAX_IDLE = ;
var
idle_count: Integer;
begin
idle_count := ;
repeat
try
if not DoThreadJob() then
begin
if not DoThreadIdle() then
Inc(idle_count)
else
idle_count := ;
end else
idle_count := ; if idle_count >= MAX_IDLE then
begin
idle_count := ;
Sleep();
end;
except
on E: Exception do
DoHandleException(E);
end;
until Terminated;
end;
然后,线程在未有作业处理时,去做空闲处理,空闲处理也未有时,再sleep,我觉得这思路,在写长期运行的逻辑服务处理是很好的适用思路。
且很多处理,是可以放置于ThreadIdle进行外部处理,再扩展,如同Application.Idle,运行频率是非常高。。。
好像要写的东西,就这么些。。。
水平有限,如有雷同,就是盗链,:D
2014.11.02 by qsl
delphi.thread.线程循环执行体结构的更多相关文章
- java thread 线程锁同步,锁,通信
12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...
- Golang源码学习:调度逻辑(三)工作线程的执行流程与调度循环
本文内容主要分为三部分: main goroutine 的调度运行 非 main goroutine 的退出流程 工作线程的执行流程与调度循环. main goroutine 的调度运行 runtim ...
- Qt 的线程与事件循环——可打印threadid进行观察槽函数到底是在哪个线程里执行,学习moveToThread的使用)
周末天冷,索性把电脑抱到床上上网,这几天看了 dbzhang800 博客关于 Qt 事件循环的几篇 Blog,发现自己对 Qt 的事件循环有不少误解.从来只看到现象,这次借 dbzhang800 的博 ...
- Java中多个线程交替循环执行
有些时候面试官经常会问,两个线程怎么交替执行呀,如果是三个线程,又怎么交替执行呀,这种问题一般人还真不一定能回答上来.多线程这块如果理解的不好,学起来是很吃力的,更别说面试了.下面我们就来剖析一下怎么 ...
- delphi 线程教学第五节:多个线程同时执行相同的任务
第五节:多个线程同时执行相同的任务 1.锁 设,有一个房间 X ,X为全局变量,它有两个函数 X.Lock 与 X.UnLock; 有如下代码: X.Lock; 访问资源 P; ...
- 流程控制:顺序结构: 代码默认从上到下依次执行 分支结构: 细分在分为如下 循环结构: while .. for ..
# ### 流程控制: ''' 流程: 代码执行的过程 流程控制: 对代码执行的过程进行管控 顺序结构: 代码默认从上到下依次执行 分支结构: 细分在分为如下 循环结构: while .. for . ...
- SSH框架新线程下执行数据库持久化时 No Session found for current thread
架构:SSH框架 问题:多线程下的持久化操作 异常No Session found for current thread出现环境: SSH框架,采用声明式事务, 通过sessionFactory.ge ...
- Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? 线程的sleep()方法和yield()方法有什么区别?
Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间 ...
- 【快手初面】要求3个线程按顺序循环执行,如循环打印A,B,C
[背景]这个题目是当时远程面试时,手写的题目.自己比较惭愧,当时写的并不好,面试完就又好好的完善了下. 一.题意分析 3个线程要按顺序执行,就要通过线程通信去控制这3个线程的执行顺序. 而线程通信的方 ...
随机推荐
- linux系统下,查看端口号被哪个应用占用
netstat -tunlp 会把所有端口和所有对应的程序显示出来. 用grep管道可过滤出来需要的信息.比如,17059端口号被占用了. 第一步:netstat -tunlp | grep 1705 ...
- ImageLoader框架的使用、调用系统相册显示图片并裁剪显示、保存图片的两种方式
ImageLoader虽然说是一个相对于比较老的一个框架了 ,但是总的来说,还是比较好用的,今天我就总结了一下它的用法.还有调用系统相册并裁剪,以及,通过sharedpreference和文件存储来保 ...
- oracle执行cmd的实现方法
网络上找到的在sqlplus中执行cmd的一些命令,主要有四种方法,这边都做了一下测试,这里做一下记录: 测试环境:window2003+Oracle 11.2.0.1.0 第一种方法: 最简单的执行 ...
- mysql 操作用户权限
使用可以对mysql数据库用户表有操作权限的用户名登陆mysqlinsert into user(Host,User,Password) values('%','name','password');如 ...
- HDU-2243 考研路茫茫——单词情结(AC自动机)
题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词. 题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目. 代码如下: # include< ...
- Servlet 3.0 异步模式
Servlet 3.0标准新增了异步处理的支持. 进行异步处理的Servlet和作用于该Servlet的拦截器都必须声明对于异步处理的支持.
- s2 devMode cmdshell
s2 devMode cmdshell 仅支持批量验证,命令执行 链接:http://pan.baidu.com/s/1sl7tgRV 密码:wud8 也可以通过outscan一键获取,之后导入t ...
- 实验1_IPv6地址配置
IPv6地址配置 实验任务 (1)掌握如何在路由器及PC上配置IPv6地址 (2)掌握如何用IPv6 ping命令进行IPv6地址可达性检查 (3)掌握如何用命令来查看IPv6地址配置 实验过程 在R ...
- new 与 malloc 的区别
1, 申请内存所在的位置 new 操作符从自由存储区上为对象动态分配内存空间,而 malloc 函数从堆上动态分配内存.自由存储区是C++基于 new 操作符的一个抽象概念,而堆是操作系统中的术语,是 ...
- [课程设计]Scrum 1.4 多鱼点餐系统开发进度
Scrum 1.4 多鱼点餐系统开发进度 (点餐页面框架布置) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系 ...