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个线程的执行顺序. 而线程通信的方 ...
随机推荐
- python基础(1)
一.应用 python应用:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算. 使用python的企业:YouTube.dropbox.BT.Quora.豆瓣.知乎.google.Yahoo ...
- 2015.10.15night
#include<stdio.h> main() { int x,y; scanf("%d",&x); if(x>0)y=1; else {if(x< ...
- UICollectionViewCell选中高亮状态和UIButton的高亮状态和选中状态
UICollectionViewCell选中高亮状态 //设置点击高亮和非高亮效果! - (BOOL)collectionView:(UICollectionView *)collectionView ...
- java批量insert入mysql数据库
mysql 批量insert语句为 insert into Table_(col1,col2...) values(val11,val12...),(val11,val12...),...; java ...
- grep命令学习
grep(Globally search a Regular Expression and Print), 全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把 ...
- OpenCV学习笔记——OpenCV安装
关于OpenCV安装 1.下载和安装OpenCV SDK 在官网:http://opencv.org/上找到OpenCV windows版下载 . 后得到一个 opencv-2.X.X.exe的文件, ...
- myeclipse编译、输出
在项目上点右键:run--run configuration, 选择左边的“compile GWT Application”,新建一个编译配置,然后选右下角的run.
- HTML5 Canvas核心技术图形动画与游戏开发(读书笔记)----第一章,基础知识
一,canvas元素 1 为了防止浏览器不支持canvas元素,我们设置“后备内容”(fallback content),下面紫色的字即为后备内容 <canvas id="canvas ...
- 将JSON格式的时间/Date(2367828670431)/格式 转为正常的年-月-日 格式
function formatDate(NewDtime) var dt = new Date(parseInt(NewDtime.slice(6, 19))); var year = dt.getF ...
- 扩展Redis的Lua调用方式
Redis是支持Lua脚本的,但是我以为并不方便. 1. SCRIPT LOAD一个字符串拿到一个SHA,首先这个Lua script脚本就很难拿到.Linux一般用cat什么的.但是你作为PHP怎么 ...