AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > C++

C++ Builder 定义线程对象

51自学网 http://www.51zixue.net

7.1.2 编写线程函数
Execute方法就是线程函数。除了分享相同的进程空间外,都可将其认为是通过应用程序启动的程序。编写线程函数需要注意有点与单独的程序不同,必须确认没有覆盖应用程序其他线程所使用的内存。
另一方面,因为线程与其他线程共享相同的进程空间,可使用共享内存在线程之间通信。

1.使用主VCL线程
当从VCL对象分层结构中使用对象时,它们的属性和方法并不保证对线程是安全的。也就是说,访问属性或执行方法可能会执行一些使用内存的动作,但却没有保护这些内存不为其他线程的动作所用。因此,设置主VCL线程用于访问VCL对象。这是一个处理应用程序中组件收到的所有Windows消息的线程。

若所有对象都在这个线程内访问其属性和执行其方法,就不用担心对象会互相影响。要使用主VCL线程,需创建一个执行所需动作的独立的例程。然后在线程的Synchronize方法中调用这个独立例程。例如:


Synchronize方法等待主VCL线程输入消息循环,然后执行传入的方法。
注意 因为Synchronize方法使用消息循环,所以不能工作在控制台应用程序中。必须使用其他机制,如重要区段,在控制台应用程序保护对VCL对象的访问。

并不是总需要使用主VCL线程。一些对象是线程感知的。当知道对象的方法是线程安全的时,可省略Synchronize方法,这会增加程序的效率,因为可以不用等待VCL线程输入消息循环。

下列情况下不需要使用Synchronize方法:
· 对于可用BDE的数据集,每个线程若都有自己数据库会话组件,则数据存取组件是线程安全的。
有一个例外情况是使用Access驱动程序,因为它是由Microsoft库创建的,而Microsoft库不是线程安全的。ADO及InterbaseExpress组件是线程安全的。当使用数据存取组件时,仍然必须在Synchronize方法中封装所有的对数据-感知控件的调用。例如,需通过设置数据源对象的DataSet属性同步调用一个数据控件与一个数据集的链接,但不需要同步对数据集的字段数据的访问。关于可用BDE的应用程序的线程中数据库会话的更多信息,请参见17.2节。

· 图形对象是线程安全的。不需要使用主VCL线程访问TFont、TPen、TBrush、TBitmap,TMetafile或TIcon。通过锁定对象可在Synchronize方法外使用画布对象。
· 当列表对象不是线程安全的时,可使用一种线程安全的版本TThreadList来代替TList。

2.使用线程局部变量
与其他的C++例程相同,Execute方法及其调用的任何例程都有它们自己的局部变量。这些例程也能访问任意的全局变量。实际上,在线程间的通信方面全局变量提供了更强大的机制。

然而,有时可能会需要在线程中的所有例程中使用全局变量,但不希望同一线程类的其他实例共享它。这时可声明一个线程局部(thread-local)变量。通过将__thread修饰语加入变量声明就可声明一个线程局部变量。例如,

int __thread x;

声明一个整型变量,对应用程序中的各个线程来说它是私有的,但在每个线程内它是全局的。—thread修饰语只可用于全局(文件范围)或静态变量。指针和函数变量不能作为线程变量。使用“在写入时复制”语法的类,如AnsiStrings也不能作为线程变量。需要运行时初始化或运行时完成的程序元素不能被声明为__thread类型。

下面的声明需要运行时初始化,因此是非法的。


用户自定义构造和析构函数的类的实例需要运行时初始化,因此是非法的:


3.检验其他线程发出的结束消息
当调用Execute方法时线程开始(参见7.3节)并继续执行直到Execute结束。这就是线程执行特定任务,并在其完成时终止的模式。然而,有时应用程序需在一些外部条件满足时终止线程。

通过检验Terminated属性可允许其他线程通知本线程可以终止。当其他线程试图终止本线程时,它调用Terminate方法。Terminate方法将本线程的Terminated属性设为true。Execute方法通过检验和响应Terminated属性来实现Terminate方法。下例显示了这样做的一种方法:


7.1.3 编写清理代码
可在线程终止运行时集中清理代码。在线程终止前,OnTerminate事件发生。将清理代码放在OnTerminate事件处理程序中,可确保不管Execute方法如何执行,清理代码总是执行。

OnTerminate事件处理程序不作为线程的一部分运行。它是在应用程序主VCL线程中运行的。这有两个含意:
· 在OnTerminate事件处理程序中不能使用任何线程局部变量(除非需要主VCL线程的值)。
· 在OnTerminate事件处理程序中可安全地访问任何组件及VCL对象,不会和其他线程发生冲突。参见7.1.2节的“使用主VCL线程”,可获得关于主VCL线程的更多信息。

 
 

上一篇:使用 C++ Builder 创建应用程序  下一篇:将声音和/或视频剪辑加入应用程序