TThread 线程的例子

D:\Documents\Embarcadero\Studio\14.0\Samples\CPP\RTL\Threads

TThread类   该线程类可以完成大多数的线程操作

TThread类的属性

1.(1)FreeOnTerminate属性

当线程终止时是否自动删除线程对象.默认值为True;  语法:property FreeOnTerminate: Boolean;

2 Priority属性      指定线程的优先级.   property Priority: TTreadPriority;

3 ReturnValue属性       线程终止时,用该属性为其他线程传递一个返回值.

4 Suspended属性      指定线程是否处于挂起状态

5 Terminated       线程运行晨,如果将属性为True时,线程终止

6 ThreadID属性      线程的惟一标识

7 Handle属性      线程句柄

TThread类方法

DoTerminate: 调用线程对象DoTerminate方法可以触发线程的OnTerminate事件

Execute:线程的执行部分都写在该有方法中.必须实现的

Resume:当线程对象处于暂停状态时,调用此方法可以恢复线程运行

Suspend:暂停线程

Synchronize:线程同步

Terminate:终止线程

WaitFor:等待线程对象的终止,并返回线程对象的ReturnValue属性值

使用线程,当窗体关闭时,如果窗体中启用了线程,一般需要手动关闭,以释放资源。  常用来结束线程的代码为:
thread.Terminate;
thread.WaitFor;
即先触发Terminate方法,然后等待线程的结束。这种方法要求线程不能使用
FreeOnTerminate := True;
否则在WaitFor即将结束的时候会引发“无效句柄”的错误。 这种方法在窗体关闭的时候会等待一段事件(因为WaitFor)。
因此,如果不是在主窗体中结束线程时,其实我们可以不必使用WaitFor。而是采用如下方法: 将FreeOnTerminate := True;这样在窗体关闭的代码中直接调用
thread.Terminate; 即可。
注意: 如果设置了 thread.OnTerminate := SomeFunction; 那么在调用PcmThrd.Terminate;前尽量将thread.OnTerminate := nil,以免结束线程后SomeFunction中的变量出现空指针错误。当然,这不是绝对的,需要根据具体程序而定 . From ccrun http://www.ccrun.com/article.asp?i=337&d=r876hk

TThread是一个抽象类,可以创建几个独立的线程。
类关系 TObject
在一个多线程的应用程序中创建一个TThread的后子类代表一个线程。每一新子类的TThread对象的实例是一个新的线程。从TThread派生的多线程实例可以构成Delphi的多线程应用程序。
  当一个应用程序运行时,应用程序就被载入内存准备执行。此时,它成为包含一个或多个线程的进程,每个线程含有数据、代码和系统资源。线程执行应用程序的部分内容,并由系统分配CPU时间。同一进程的所有线程共享同一地址空间,可以访问进程的全局变量。线程通过以下工作改善应用的性能:管理多通信设备的输入。
  区分任务的优先级。优先级高的处理紧急的任务。优先级低的处理其他任务。
  以下是使用线程的一些建议:
  同时跟踪太多的线程消耗CPU时间。对单处理器系统,一个进程最多有16个线程。
  当多个线程更新相同的资源时,应使线程同步以避免冲突。
  大多数访问VCL对象和更新窗体的方法必须从主VCL线程内部调用。
  以下为创建和使用一个新线程的过程:
  (1)单击File|New|Thread菜单项,创建一个包含对象的新单元,该对象源于TThread类。
  (2)定义新线程对象和Create方法。
  (3)通过插入线程执行时需要的代码定义线程对象和Execute方法。
  (4)将使用VCL组件的任何调用传递给Synchronize方法,以避免多线程冲突。

属性列表
FreeOnTerminate 线程终止时该对象是否自动删除
Handle 包含线程句柄
Priority 确定该线程相对于进程中其他线程的优先级
ReturnValue 返回线程值
Suspended 指示一线程是否被挂起
Terminated 表明线程被要求终止
ThreadID 标识贯穿系统的线程

方法列表
~TThread 删除线程对象并释放其战用的内存空间
DoTerminate 产生一个OnTerminate事件
Execute 提供包含线程执行时所需代码的抽象方法
Resume 重新执行一个挂起的线程
Suspend 挂起一个运行中的线程
Synchronize 在主VCL线程中执行Method
Terminate 将Ternimated属性设置为True通知线程终止
TThread 创建一个线程对象的实例
WaitFor 等待线程终止并返回ReturnValue属性值

事件列表
OnTerminateExecute 方法已返回且该线程被删除前发生

属性

TThread::FreeOnTerminate
__property bool FreeOnTerminate = {read=FFreeOnTerminate,write=FFreeOnTerminate,nodefault};
确定当线程终止时,该线程对象是否自动删除。
FreeOnTerminate默认值为False,线程对象必须在代码中显示删除。
包含线程句柄。
当调用Win32API函数处理线程时,使用Handle.

TThread::Priority
__property TThreadPriority Priority = {read=GetPriority,write=SetPriority,nodefault};
确定该线程相对于进程中其他线程的优先级。
Priority属性为一枚举类型,其默认为tpNormal.
TThreadPriority类型定义了TThread组件的Priority属性的可能值,如下表所述。Windows根据优先级确定每一个线程的CPU周期。
_____________________________________________________________________
   值           含义
_____________________________________________________________________
tpIdle 只有当系统空闲时该线程执行
tpLowest 线程优先级比正常低2点
tpLower 线程优先级比正常低1点
tpNormal 线程优先级为正常值
tpHigher 线程优先级比正常高1点
tpHighest 线程优先级比正常高2点
tpTimeCritical 线程优先级最高

TThread::ReturnValue
__property int ReturnValue = {read=FReturnValue,write=FReturnValue,nodefault};
返回线程值。
使用ReturnValue应用为其他线程指示其成功/失败或数字结果/输出。WaitFor方法返回存储在ReturnValue中的值。

TThread::Suspended
__property bool Suspended = {read=FSuspended,write=SetSuspended,nodefault};
指示一线程是否被挂起。
除非重新执行,否则被挂起的线程不会继续执行。若将Suspended设置为True将挂起一个线程;若设置为False,则继续执行该线程。

TThread::Terminated
__property bool Terminated = {read=FTerminated,nodefault};
// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=337&d=r876hk
表明线程被要求终止。Terminate方法将Terminated属性设置为True。
线程的Execute方法和任何Execute调用的方法将周期性地检查Terminated,当其为True时,将终止执行。

TThread::ThreadID
__property int ThreadID = {read=FhreadID,nodefault};
标识贯穿系统的线程。
当调用Win32API函数处理线程时,ThreadID将十分有用。
注意:ThreadID与Handle属性不同。

方法

TThread::~TThread
__fastcall virvual ~TThread(void);
删除线程对象并释放其战胜的内存空间。
在应用中不要调用~TThread。用delete替代。
~TThread通知线程终止,并在调用Destroy方法前等待该线程返回。

TThread::DoTerminate
virtual void __fastcall DoTerminate(void);
产生一个OnTerminate事件。
DoTerminate调用OnTerminate时间句柄,但并不终止该线程。

TThread::Execute
virtual void __fastcall Execute(void) =0;
提供包含线程执行时所需代码的抽象方法。
Execute查看Terminated属性值以决定该线程是否需要终止。
当CreateSuspended被设置为False,当调用Create时,一线程执行;在线程创建后先调用了Resume且CreateSuspended为True,一线程执行。
注意:不要在线程的Execute方法中直接调用其他对象的属性和方法。应该将对其他对象的使用分成几个不同的过程,将其作为一个传递到Synchronize方法的参数分别调用。

TThread::Resume
void __fastcall Resume(void);
重新执行一个挂起的线程。
调用Suspend可以嵌套。因此调用Resume必须注意次序。

TThread::Suspend
void __fastcall Suspend(void);
挂起一个运行中的线程。
调用Resume可以继续运行。调用Suspend可以嵌套。因此调用Resume必须次序。

TThread::Synchronize
typedef void __fastcall(__closure* TThreadMethod)(void);
void __fastcall Synchronize (TThreadMethod&Method);
在主VCL线程中执行Method。
Synchronize方法由Method指定的调用被主VCL线程执行。
注意:当在主VCL线程中执行Method时,当前的线程被挂起。

TThread::Terminate
void __fastcall Terminate(void);
通过将Terminated属性设置为True通知线程终止。
线程的Execute方法以及Execute调用的任何方法应周期性的检查Terminated,当其为True时终止运行。

TThread::TThread
__fastcall TThread(bool CreateSuspended);
创建一个线程对象的实例。
在应用中不要直接使用TThread来创建线程。用new替代,传递CreateSuspended参数argument。若CreateSuspended为False,Execute被立即调用。若CreateSuspended为True,Execute直到Resume被调用后才被调用。

TThread::WaitFor
int __fastcall WaitFor(void);
等待线程终止并返回ReturnValue属性值。
直到线程终止时WaitFor才返回,因此线程一定是因为结束了Execute方法或因Terminated属性为了True而终止。如果该线程使用Synchronize,则不要在主VCL线程中调用WaitFor,否则或者引起系统死机,或者产生一个EThread异常。
Synchronize在允许该方法生效前等待主VCL线程进入信息回路。若主VCL线程已经调用了WaitFor,它将不会进入信息回路,Synchronize也永远不会返回。此时,TThread将产生一个EThread意外并使该线程终止;而且如果该意外没有被Execute方法截获,该应用也将终止。如果调用WaitFor时,Synchronize已经在VCL线程中等待,TThread将不会干预,应用程序将死机。

事件

TThread::OnTerminate
__property TNotifyEvent OnTerminate = {read=FOnTerminate,write=FOnTerminate};
当线程的Execute方法已经返回且在该线程被删除之前发生。
OnTerminate事件句柄在主VCL线程被调用。该线程对象也可在该事件中被释放。


TThread 线程的例子的更多相关文章

  1. JAVA线程池例子

    用途及用法 网络请求通常有两种形式:第一种,请求不是很频繁,而且每次连接后会保持相当一段时间来读数据或者写数据,最后断开,如文件下载,网络流媒体等.另 一种形式是请求频繁,但是连接上以后读/写很少量的 ...

  2. C# 多线程之通过Timer开启线程的例子

    本例通过Timer的tick()方法触发TimerCallback委托来开辟新的线程,线程中的具体工作通过一个静态方法作为参数给TimerCallback委托. using System; using ...

  3. (转)synchronize线程同步例子

    在CSDN开了博客后,一直也没在上面发布过文章,直到前一段时间与一位前辈的对话,才发现技术博客的重要,立志要把CSDN的博客建好.但一直没有找到好的开篇的主题,今天再看JAVA线程互斥.同步的时候又有 ...

  4. 一个Java线程小例子(仿火车票售卖)

    public class MyThread extends Thread{ private static int ticket=100; public void run(){ for(int i=0; ...

  5. [C++] socket - 3 [线程简单例子 代码]

    #include<windows.h> #include<stdio.h> DWORD WINAPI myfun1(LPVOID lpParameter);//声明线程函数 D ...

  6. Thread 线程简单例子

    //这个方法是 静态的 public static void ThreadFunc() {//计数器 ; while(true) { //休眠1秒 Thread.Sleep(); //计数器递增 co ...

  7. 一个Qt线程的例子,用于说明QWaitCondition的作用

      描述可能比较麻烦,还是直接上代码吧! main.cpp #include <QApplication> #include "mainpage.h" int main ...

  8. qt 中创建一个工作线程(例子)

    当一个事件需要很长的处理时间,就创建一个工作线程,防止主界面卡死. 1.新建一个QT的gui项目,里面包含main.cpp,mainwindow.h,mainwindow.cpp,mainwindow ...

  9. Delphi中线程类TThread实现多线程编程1---构造、析构……

    参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...

随机推荐

  1. NOI2001 食物链【扩展域并查集】*

    NOI2001 食物链 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的 ...

  2. js去重复和取重复数据

    js数组中取重复数据的方法: 方法一:去重复数据 <script> Array.prototype.distinct=function(){ var a=[],b=[]; for(var ...

  3. Machine Schedule(二分图匹配之最小覆盖点,匈牙利算法)

    个人心得:二分图啥的一点都不知道,上网借鉴了下,请参考http://blog.csdn.net/thundermrbird/article/details/52231639 加上自己的了解,二分图就是 ...

  4. Spring核心机制:依赖注入

    转载:http://www.cnblogs.com/chenssy/ Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因 ...

  5. Mathtype启动失败与Microsoft公式编辑器Equation的问题处理案例

    最近写毕业论文需要使用Mathtype,安装成功后,启动Word,使用Mathtype,出现各种问题. 遇到的问题: 1.弹出“用于创建对象的程序是Equation.您的计算机尚未安装此程序.若要编辑 ...

  6. 纯 as3 项目中引用 fl 包下的类

    如果安装了 Flash IDE, 将下面的文件添加到项目的 libs 中即可:D:\Program Files\Adobe\Adobe Flash CS6\Common\Configuration\A ...

  7. odoo 使用源码安装时的注意

    odoo 使用源码安装时的注意 使用 odoo 源安装 odoo 时,会增加 odoo 官方的 odoo 源. 安装时直接输入 yum install odoo 即可安装 odoo. 但是更新时就要注 ...

  8. QT creator 调试问题

    问题:debug出现“ptrace:不允许的操作.” 解决办法: # may not be appropriate for developers or servers with only admin ...

  9. jeecg选择按钮带入其他单据值

    前端的标签 <input class="inputxt" id="fshimian" name="fshimian" ignore=& ...

  10. Win10系统WMIProviderHost进程占用CPU过高

    “WMI Provider Host“占用了过多CPU资源导致系统卡顿,该如何解决这个问题呢? 解决方法: 可以尝试关闭Windows防火墙服务来解决这个问题. 1.按住win+R,输入service ...