线程话题太大,又都是些坑,不知从哪方面讲起,所以,想一出是一出了。

  不管怎样,我们从开始使用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.线程循环执行体结构的更多相关文章

  1. java thread 线程锁同步,锁,通信

    12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...

  2. Golang源码学习:调度逻辑(三)工作线程的执行流程与调度循环

    本文内容主要分为三部分: main goroutine 的调度运行 非 main goroutine 的退出流程 工作线程的执行流程与调度循环. main goroutine 的调度运行 runtim ...

  3. Qt 的线程与事件循环——可打印threadid进行观察槽函数到底是在哪个线程里执行,学习moveToThread的使用)

    周末天冷,索性把电脑抱到床上上网,这几天看了 dbzhang800 博客关于 Qt 事件循环的几篇 Blog,发现自己对 Qt 的事件循环有不少误解.从来只看到现象,这次借 dbzhang800 的博 ...

  4. Java中多个线程交替循环执行

    有些时候面试官经常会问,两个线程怎么交替执行呀,如果是三个线程,又怎么交替执行呀,这种问题一般人还真不一定能回答上来.多线程这块如果理解的不好,学起来是很吃力的,更别说面试了.下面我们就来剖析一下怎么 ...

  5. delphi 线程教学第五节:多个线程同时执行相同的任务

    第五节:多个线程同时执行相同的任务   1.锁   设,有一个房间 X ,X为全局变量,它有两个函数  X.Lock 与 X.UnLock; 有如下代码:   X.Lock;      访问资源 P; ...

  6. 流程控制:顺序结构: 代码默认从上到下依次执行 分支结构: 细分在分为如下 循环结构: while .. for ..

    # ### 流程控制: ''' 流程: 代码执行的过程 流程控制: 对代码执行的过程进行管控 顺序结构: 代码默认从上到下依次执行 分支结构: 细分在分为如下 循环结构: while .. for . ...

  7. SSH框架新线程下执行数据库持久化时 No Session found for current thread

    架构:SSH框架 问题:多线程下的持久化操作 异常No Session found for current thread出现环境: SSH框架,采用声明式事务, 通过sessionFactory.ge ...

  8. Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? 线程的sleep()方法和yield()方法有什么区别?

    Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间 ...

  9. 【快手初面】要求3个线程按顺序循环执行,如循环打印A,B,C

    [背景]这个题目是当时远程面试时,手写的题目.自己比较惭愧,当时写的并不好,面试完就又好好的完善了下. 一.题意分析 3个线程要按顺序执行,就要通过线程通信去控制这3个线程的执行顺序. 而线程通信的方 ...

随机推荐

  1. 评价qq拼音输入法

    我目前正在使用qq拼音输入法,从人机交互设计方面,我对qq输入法从用户界面.记住用户选择.短期刺激和长期使用的好处坏处.不让用户犯简单错误这四个方面进行了评价. 1.从用户界面方面: qq输入法用户界 ...

  2. Oracle----Job

    最近需要使用到Oracle的定时Job,感觉到学习能力很重要,同时也感觉到及时总结和记笔记也很重要,现在开始总结Job的使用

  3. js或jquery如何获取父级、子级、兄弟元素(包括祖级、孙级等)

    原生javascript方法: var a = document.getElementById("dom"); del_space(a); //清理空格 var b = a.chi ...

  4. 三级联动(在YII框架中)

    //三级联动 //数据库代码过多就不上传了 //视图 <div class="area">    <table class="table"&g ...

  5. jQuery中方法html()与text()的不同

    区别一:html()方法设置或者返回被选元素的内容,其效果类似于操作元素对象的“innerHTML”属性:text()方法设置或者返回被选元素的文本内容,其效果等同于操作元素对象的“textConte ...

  6. 全面解析sizeof(上) 分类: C/C++ StudyNotes 2015-06-15 10:18 188人阅读 评论(0) 收藏

    以下代码使用平台是Windows7 64bits+VS2012. sizeof是C/C++中的一个操作符(operator),其作用就是返回一个对象或者类型所占的内存字节数,使用频繁,有必须对齐有个全 ...

  7. JavaScript 消息框+特殊字符

    JavaScript 中创建三种消息框:警告框.确认框.提示框: 1.警告框: 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作 语法:alert(&qu ...

  8. Python单元测试和Mock测试

    单元测试 测试可以保证你的代码在一系列给定条件下正常工作 测试允许人们确保对代码的改动不会破坏现有的功能 测试迫使人们在不寻常条件的情况下思考代码,这可能会揭示出逻辑错误 良好的测试要求模块化,解耦代 ...

  9. (document).height()、$(document).scrollTop()

    (document).height().$(document).scrollTop(),有需要的朋友可以参考下. jQuery(window).height()代表了当前可见区域的大小,而jQuery ...

  10. 性能测试工具 转自https://yq.aliyun.com/articles/35149?spm=5176.100239.blogcont35147.8.rsow6k

    摘要: 继续这个系列的学习,这一节重点介绍目前流行的性能测试工具以及如何选择适合项目的工具.在此之前,我已经对性能测试工具的原理与架构做了分析. http://www.cnblogs.com/fnng ...