Linux中国  设为主页
 收藏本站
 
当前位置: > 首页 ->编程语言 ->Delphi ->剖析TThread类
  相关分类: 
ASP
ViualBasic
UML / Rational Rose
PHP4/PHP5
Perl
JAVA/JSP教程
Delphi
ColdFusion
CGI
C/C++
ASP.NET
XML
  站内搜索: 
热门文章排行
热门文章排行 Delphi字符串函数大全(06-05)
Windows的DDE原理(06-05)
制作QQ消息炸弹(06-05)
delphi中的XML解析控件TXMLDocument(06-05)
谈Delphi编程中“流”的应用(06-05)
精采文章排行
精采文章排行 如何用Delphi制作录音程序(06-05)
谈Delphi编程中“流”的应用(06-05)
如何把数据库的内容写入到Word文档中(06-05)
从实作标题栏按钮开始浅谈组件的制作(06-05)
“98五笔字型输入法”大批量造词(06-05)
  ·谈Delphi编程中“流”的应用·如何把数据库的内容写入到Word文档中?·从实作标题栏按钮开始浅谈组件的制作·“98五笔字型输入法”大批量造词·关于Delphi大Bug的更详细的例子·不知您是笨蛋,还是我是笨蛋,关于Delphi·剖析TThread类·理解类引用这种类型·改良控件-Delphi自带控件Bug的消除

剖析TThread类

作者:Webmaster   来源:Linuxdby.com   点击:   日期:2007-06-05 [收藏] [投稿]

  IE是否经常中毒?推荐您

 

TThread类剖析


摘要


    本文从分析源代码的角度介绍Delphi5中的TThread类的封装和运行机理,介绍了TThread类的优缺点。


    关键词:Delphi5,TThread,Windows API


 


目录


    1.概述


    2.剖析TThread类


        2.1 TThread的优点


        2.2 TThread的封装和运行机理


    3.结束语


    4.致谢


    5.参考文献


全文


1.概述


    根据Windows SDK文档的说明,在Windows线程中的运行实体是类型为:function ThreadFunc(Parameter: pointer): integer的函数(翻译成Delphi的格式)。但是我们都知道,在Delphi中线程被封装成一个TThread类。为什么Delphi要将它封装成一个类?Delphi是如何封装的呢?我们怎样才能充分的利用两者的优点?这就是本下面要介绍的。


2.剖析TThread类


    2.1 TThread的优点


    将线程作为类来封装有着许多优点。首先它能清晰、安全的界限线程相关的局部变量和进程相关的全局变量。类——对象的模型到实体的映射关系保证了声明在类中的任何变量都是局部的,声明在类外的任何变量都是全局的。所以在写新线程的Execute函数只要注意对类外部的变量、方法的访问就可以了,至于类内部的变量、方法则可以任意使用而不用考虑同步的问题。将线程封装成类的更重要的好处是写新线程的时候可以充分利用类的优点。你可以通过继承来重用父类的功能,这实在是一个激动人心的功能。


    2.2 TThread的封装和运行机理


    既然已经知道将线程封装成类有诸多好处,作为一个称职的程序员一定会去了解Delphi是如何将线程封装成类的,有没有更好的封装的方法的。


    Delphi5中TThread类是这样声明的:


{ TThread }

EThread = class(Exception);

TThreadMethod = procedure of object;
TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest,
  tpTimeCritical);

TThread = class
private
  FHandle: THandle;
  FThreadID: THandle;
  FTerminated: Boolean;
  FSuspended: Boolean;
  FFreeOnTerminate: Boolean;
  FFinished: Boolean;
  FReturnValue: Integer;
  FOnTerminate: TNotifyEvent;
  FMethod: TThreadMethod;
  FSynchronizeException: TObject;
  procedure CallOnTerminate;
  function GetPriority: TThreadPriority;
  procedure SetPriority(Value: TThreadPriority);
  procedure SetSuspended(Value: Boolean);
protected
  procedure DoTerminate; virtual;
  procedure Execute; virtual; abstract;
  procedure Synchronize(Method: TThreadMethod);
  property ReturnValue: Integer read FReturnValue write FReturnValue;
  property Terminated: Boolean read FTerminated;
public
  constructor Create(CreateSuspended: Boolean);
  destructor Destroy; override;
  procedure Resume;
  procedure Suspend;
  procedure Terminate;
  function WaitFor: LongWord;
  property FreeOnTerminate: Boolean read FFreeOnTerminate write FFreeOnTerminate;
  property Handle: THandle read FHandle;
  property Priority: TThreadPriority read GetPriority write SetPriority;
  property Suspended: Boolean read FSuspended write SetSuspended;
  property ThreadID: THandle read FThreadID;
  property OnTerminate: TNotifyEvent read FOnTerminate write FOnTerminate;
end;


    准确地说,TThread对象是一个带有线程实例的不可见窗体对象(长宽都为0),我把这个窗体叫做线程窗体。这个线程窗体有该TThread类的所有对象共享。TThread在构造的时候线程是否第一次创建,如果是就创建线程窗体,然后增加线程计数,最后才建立线程实例。同理,TThread对象在销毁的时候,先减少线程计数,然后判断计数是否为0,如果是就销毁线程窗体。

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

上一页12 3 下一页

上一篇:理解类引用这种类型   下一篇:不知您是笨蛋,还是我是笨蛋,关于Delphi的大Bug
文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论

   相关文章:
·如何用Delphi制作录音程序

   文章评论:(1条)
  
 请留名: 匿名评论   点击查看所有评论 论坛讨论
 

 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。