户线程中所有过程而言是全局的变量,但却 不能被叫一个线程类的其他实例共享。
2.检查是否被其他线程终止 用户线程对象在Execute方法调用时开始运行, 并且在Execute方法结束时终止。然而有时应用 程序需要一个线程持续执行,直到某个外部条件 得到满足。这时,用户可以让其他的线程通过 Terminated属性来通知用户线程终止。当其他 线程想终止用户线程时,可以调用Terminate方 法,该方法将用户线程对象的Terminated属性 值设为True。 13.2.4 编写线程的清除代码 OnTerminate事件处理过程不作为用户线程 的一部分运行,它在主VCL线程中运行,因此必 须注意以下两点:
(1)用户在OnTerminate事件处理过程中不能使用 任何线程局部变量; (2)用户在OnTerminate事件处理过程中可以安全 的访问任何组件以及VCL对象而不必担心与其他 线程发生冲突。
13.3 使用线程对象
13.3.1 线程的同步 VCL支持三种方法来避免其他线程与用户线 程访问同样的内存区域。 1.锁住对象 2.使用临界区
临界区就像一个门,一次只允许一个线程进入。 要使用临界区,就要创建一个全局 TcriticalSection对象。该对象有两个方法: Acquire(阻塞其他线程执行临界区的代码)和 Release(释放阻塞)。 每个临界区都和用户要保存的全局内存相联 系,每个线程在访问一个全局内存之前都应该首 先调用Acquire方法以确保没有其他线程在使用 它。 3.使用multi—read—exclusive—write同步 当用户使用临界区保护全局内存时,每
次只 有一个线程可以使用该内存区,这样的保护可能 满足不了用户的要求,特别是用户要求有一个必 须经常读而很少写的对象或变量的时候。
13.3.2 执行线程对象 1.重载优先级 当在线程中指定它所能得到的CPU时间时, 应在构造函数中指定线程的优先级。然而,如果 线程的优先级依赖于线程何时执行,就应该创建 可以进入挂起状态的线程,设置线程的优先级, 然后开始执行程序。 2.启动和停止线程 一个线程在运行前可以被启动和中止很多次。 要临时中止一个线程的执行,可以使用线程的 Suspend方法。用户可以调用Terminate方法要 求一个线程提前停止,该方法将线程的 Terminated属性设置为True。
3.暂存线程 要暂存线程,用户必须维护一个已经创建的 线程的
列表,这个列表可以由使用线程的一个对 象维护;另一个办法是用户可以使用一个全局变 量来暂存线程。
13.4 利用多线程排序
1.界面
设计 向窗体中增加3个Label、3个PaintBox和1个 Button控件 。 2.程序设计