转:学习笔记: Delphi之线程类TThread
学习笔记: Delphi之线程类TThread - 5207 - 博客园
http://www.cnblogs.com/5207/p/4426074.html
新的公司接手的第一份工作就是一个多线程计算的小系统。也幸亏最近对线程有了一些学习,这次一接手就起到了作用。但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时间。
TThread-简单的开始
在Delphi的VCL中封装了一个TThread类用于多线程的开发,这样比较符合面向对象的思想,同时又可以提高开发效率,一般的情况下开发都是通过派生这个类来实现多线程。所以重点还在这个类TThread上: 简单的看一眼,这个类倒也简单,就是封装了线程的API,通过一个ThreadProc函数来完成了多线程整个过程。很容易就能派生一个线程类:
复制代码
TMyThread = class(TThread)
private
FCount: Integer;
FOnShowValue: TGetStrProc;
protected
procedure Execute; override;
public
constructor Create;
property Count: Integer read FCount;
property OnShowValue: TGetStrProc read FOnShowValue write FOnShowValue;
end; { TMyThread } constructor TMyThread.Create;
begin
inherited Create(False);
FCount := ;
FreeOnTerminate := False;
end; procedure TMyThread.Execute;
begin
while not self.Terminated do
begin
Inc(FCount); if Assigned(FOnShowValue) then
FOnShowValue(IntToStr(FCount)); Sleep();
end;
end;
复制代码
代码中只覆盖了一个Execute方法即可,其他的代码都是业务相关的代码,还是非常简单好用。 线程挂起 线程还支持挂起的功能,即让CPU将线程中断,保留现场,不再分配时间片,这样线程就像死了一般,直到再次唤醒线程再恢复现场继续执行。
线程终止 在Delphi的TThread类实现中,可以通过一个Terminate方法来让线程终止。但事实上Terminated只是一个标识而已,在线程启动时这个标识为False。 线程释放
一般线程创建后运行完会自动释放,所以这里的类里我设置FreeOnTerminate := False;,这样线程对象就不会自动释放,这样做的好处就是可以由线程对象以外的代码来管理线程的生命周期,如果有的代码需要控制线程对象的生命周期就可以用这个属性来让线程不自己释放。 ThreadProc-源代码分析
复制代码
function ThreadProc(Thread: TThread): Integer;
var
FreeThread: Boolean;
begin
{$IFDEF LINUX}
if Thread.FSuspended then sem_wait(Thread.FCreateSuspendedSem);
{$ENDIF}
try
if not Thread.Terminated then
try
Thread.Execute;
except
Thread.FFatalException := AcquireExceptionObject;
end;
finally
FreeThread := Thread.FFreeOnTerminate;
Result := Thread.FReturnValue;
Thread.FFinished := True;
Thread.DoTerminate;
if FreeThread then Thread.Free;
{$IFDEF MSWINDOWS}
EndThread(Result);
{$ENDIF}
{$IFDEF LINUX}
// Directly call pthread_exit since EndThread will detach the thread causing
// the pthread_join in TThread.WaitFor to fail. Also, make sure the EndThreadProc
// is called just like EndThread would do. EndThreadProc should not return
// and call pthread_exit itself.
if Assigned(EndThreadProc) then
EndThreadProc(Result);
pthread_exit(Pointer(Result));
{$ENDIF}
end;
end;
复制代码
对于TThread的一个关键部分就是这个ThreadProc方法,它是线程创建时传给系统API的回调函数;Delphi中通过这个方法完成了一个核心的功能,可以看到代码中调用了Execute方法。这也就是为什么派生类只要覆写这个方法的原因。 所以从代码也可以看出,线程启动后代码是顺序执行的,代码走完就结束了,所以为了让线程能够一直在运行就要在Execute方法里加上一个死循环,保证线程一直在运算,直到接收到Terminated时才让线程结束掉。所以Terminated的真正作用在这呢,需要开发者自己来控制,当然这样也就变的非常灵活了。
转:学习笔记: Delphi之线程类TThread的更多相关文章
- Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……
接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...
- Delphi中线程类TThread实现多线程编程1---构造、析构……
参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...
- 转发 Delphi中线程类TThread 实现多线程编程
Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...
- 学习笔记: Delphi之线程类TThread
新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...
- Delphi 实现多线程编程的线程类 TThread
http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉 ...
- Delphi中的线程类 - TThread详解
Delphi中的线程类 - TThread详解 2011年06月27日 星期一 20:28 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- MOOS学习笔记4——独立线程不同回调
MOOS学习笔记4--独立线程不同回调 /** * @fn 独立线程不同回调 * @version v1.0 * @author */ #include "MOOS/libMOOS/Comm ...
- 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理
在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...
随机推荐
- Session 潜在bug防范
注意: Session的使用一定要及时的清理,因为它是“全局”的(包括其生命周期),所以在使用Session保存状态时,不用时要及时的NULL掉,小心潜在的Bug.
- Cocos2d-JS/Ajax用Protobuf与NodeJS/Java通信
原文地址:http://www.iclojure.com/blog/articles/2016/04/29/cocos2d-js-ajax-protobuf-nodejs-java Google的Pr ...
- 一些js
//fixed块随滚动条滚动 window.onscroll=function(){ var scroll_left = $(window).scrollLeft(); $('#table_fixed ...
- C++11中自定义range
python中的range功能非常好用 for i in range(100): print(i) 现在利用C++11的基于范围的for循环特性实现C++中的range功能 class range { ...
- Array的个人总结
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...
- 答辩HTML5
答辩有三个项目,有三个游戏和知乎,游戏都是有js写的,我想说的是想要做一个是那么难啊!老师给了我们游戏的项目还有游戏的思路构成,完成项目.还有一个知乎,也很难,用到HTML,css3,php,数据库, ...
- BZOJ 2096: [Poi2010]Pilots
Description 求一个最长的序列,最大值最小值之差不超过 \(k\) . Sol 单调队列. 一个队列直接上就行.. Code /******************************* ...
- 全排列算法的JS实现
问题描述:给定一个字符串,输出该字符串所有排列的可能.如输入“abc”,输出“abc,acb,bca,bac,cab,cba”. 虽然原理很简单,然而我还是折腾了好一会才实现这个算法……这里主要记录的 ...
- C#夯实基础之多线程三:线程的优先级
一.为什么需要优先级--线程调度的问题 在现实生活中,优先级是一个很常见的现象:在火车站,如果你是孕妇,你是可以走进站中的专门绿色通道的,可以提前上火车以免拥挤:火警119匪警110出警的时候,都是人 ...
- a标签填充父容器
body>div>a{Join} div{ width:150px; height:35px; } a{ display:block; line-height:35px; height:3 ...