论文部分内容阅读
一、进程与线程
一个操作系统有多个进程在同时进行,而一个进程又会有多个线程在同时进行,每个线程都有自己的执行状态和独立的上下文结构(保存在线程控制块中)及执行栈(用户栈、系统栈),同一进程中的线程通过各种同步机制(如临界区、事件、互斥量、信号灯等)来实现对共享资源的访问。
二、Delphi中的多线程机制
Delphi编译环境的核心是可以直接调用几乎所有的Windows API函数。通常是通过过程调用一系列外部模块来实现,其最大的优点是利用面向对象的技术支持。通过对Delphi中类实现的源代码分析,可以从中了解到类的构造过程及功能的实现,以便更有效的利用其提供的线程类完成多线程程序设计。
Delphi中多线程技术的实现是通过TThread类来封装Windows API的有关线程操作的编程接口。TThread类继承自TOb-ject,除继承父类的成员外还定义了一些属性和方法,主要分为线程对象属性、线程对象方法、线程对象事件处理三类:
(1)线程对象属性(Properties):
FatalException异常处理对象
FreeOnTerminate布尔量,决定线程结束时是否清除
Handle线程句柄
Priority线程优先级
ReturnValue线程返回值
Suspended布尔量,判断线程是否已挂起
Terminated布尔量,判断线程是否需要结束
ThreadID线程全局唯一的标记
(2)线程对象方法(Methods):
AfterConstruction对象创建后运行,重载自父类
Create创建线程对象构造器
Destroy释放线程对象析构器
DoTerminate释放线程前调用用户的清除例程
Execute线程执行,虚类函数,子类需重载
Resume使线程重新执行
Suspend挂起运行线程
Synchronize线程间操作同步
Terminate置线程终止标记
WaitFor等待线程结束
(其它继承自父类TObject对象)
(3)线程对象事件处理(Events):
onTerminate线程结束前调用的方法指针
2.1线程的创建、运行和终止
线程类调用继承自父类的构造器(con-structor Create)创建对象实例,接着调用线程管理例程的Addthread全局例程将全局线程记数值加1,随后即通过线程管理例程中的BeginThread全局例程调用Windows API函数Createthread,以参数形式向其传入线程运行主函数Threadproc。在此之前还将全局变量IsMultiThread置为真,以用于各线程安全地访问内存管理器实现多线程保护。值得注意的是,线程类在创建内核线程对象时总是将其置为挂起状态(为保证线程对象初始化安全),而在其AfterConstruction(重载其父类的方法)中,即在线程类的对象创建后,在判断CreateOnsuspend的保护变量后,调用Resume方法使线程开始运行。其次,线程运行主函数Threadproc代表了线程执行的全过程。当其开始运行时,直接调用TThread的Execute虚方法(线程的主要执行部分),线程执行完毕后,置线程结束标记。执行DoTerminate方法运行CallOnterminate调用用户事件处理挂钩Onterminte处理用户线程结束前的清理工作。若选择FreeOnTermi-nate属性为真,则线程运行完成后,将通过Free方法调用析构器Destory释放线程对象,关闭线程句柄,将全局线程记数减1,最后通过线程管理例程的EndThread调用API函数ExitThread通知操作系统线程结束。
2.2线程的状态切换操作
Delphi中使用私有方法GetPriority和SetPriority获取和设置线程优先级(封装Windows API的GetThreadPriority和Set-ThreadPriority)。但动态改变线程的优先级对线程的执行有潜在的危险,不慎重地提高优先级可能会造成处理器资源分配的不合理,使某些线程始终得不到处理器时间。最好是在线程构造器中创建线程对象后初始化正确的线程优先级。当用户需要挂起运行线程时,通过公有方法Suspend设置线程挂起标记,调用API函数SuspendThread挂起执行线程。唤醒线程时,使用封装了API函数Re-sumeThread的公有Resume方法实现。运行的线程是可以多次挂起和重新执行的。
2.3线程间的同步
多个线程在同一进程空间内共享进程资源带来方便的同时,也不可避免的带来各线程间的同步问题。在Delphi环境内,有些对象对于多线程应用不一定是安全的,其中,带Session部件的数据库组件、图形对象(如Tfont、Tpen、Canvas等)、对象的构造和析构本身、分配内存等是线程安全的。而可视组件库VCL中有关图形设备接口GDI的属性和方法不是线程安全的。
三、结束语
本文描述了多线程的概念及在Delphi环境中的多线程机制,剖析了Delphi的线程类的实现过程,为设计有关Delphi的相关程序打下了一定的基础。
一个操作系统有多个进程在同时进行,而一个进程又会有多个线程在同时进行,每个线程都有自己的执行状态和独立的上下文结构(保存在线程控制块中)及执行栈(用户栈、系统栈),同一进程中的线程通过各种同步机制(如临界区、事件、互斥量、信号灯等)来实现对共享资源的访问。
二、Delphi中的多线程机制
Delphi编译环境的核心是可以直接调用几乎所有的Windows API函数。通常是通过过程调用一系列外部模块来实现,其最大的优点是利用面向对象的技术支持。通过对Delphi中类实现的源代码分析,可以从中了解到类的构造过程及功能的实现,以便更有效的利用其提供的线程类完成多线程程序设计。
Delphi中多线程技术的实现是通过TThread类来封装Windows API的有关线程操作的编程接口。TThread类继承自TOb-ject,除继承父类的成员外还定义了一些属性和方法,主要分为线程对象属性、线程对象方法、线程对象事件处理三类:
(1)线程对象属性(Properties):
FatalException异常处理对象
FreeOnTerminate布尔量,决定线程结束时是否清除
Handle线程句柄
Priority线程优先级
ReturnValue线程返回值
Suspended布尔量,判断线程是否已挂起
Terminated布尔量,判断线程是否需要结束
ThreadID线程全局唯一的标记
(2)线程对象方法(Methods):
AfterConstruction对象创建后运行,重载自父类
Create创建线程对象构造器
Destroy释放线程对象析构器
DoTerminate释放线程前调用用户的清除例程
Execute线程执行,虚类函数,子类需重载
Resume使线程重新执行
Suspend挂起运行线程
Synchronize线程间操作同步
Terminate置线程终止标记
WaitFor等待线程结束
(其它继承自父类TObject对象)
(3)线程对象事件处理(Events):
onTerminate线程结束前调用的方法指针
2.1线程的创建、运行和终止
线程类调用继承自父类的构造器(con-structor Create)创建对象实例,接着调用线程管理例程的Addthread全局例程将全局线程记数值加1,随后即通过线程管理例程中的BeginThread全局例程调用Windows API函数Createthread,以参数形式向其传入线程运行主函数Threadproc。在此之前还将全局变量IsMultiThread置为真,以用于各线程安全地访问内存管理器实现多线程保护。值得注意的是,线程类在创建内核线程对象时总是将其置为挂起状态(为保证线程对象初始化安全),而在其AfterConstruction(重载其父类的方法)中,即在线程类的对象创建后,在判断CreateOnsuspend的保护变量后,调用Resume方法使线程开始运行。其次,线程运行主函数Threadproc代表了线程执行的全过程。当其开始运行时,直接调用TThread的Execute虚方法(线程的主要执行部分),线程执行完毕后,置线程结束标记。执行DoTerminate方法运行CallOnterminate调用用户事件处理挂钩Onterminte处理用户线程结束前的清理工作。若选择FreeOnTermi-nate属性为真,则线程运行完成后,将通过Free方法调用析构器Destory释放线程对象,关闭线程句柄,将全局线程记数减1,最后通过线程管理例程的EndThread调用API函数ExitThread通知操作系统线程结束。
2.2线程的状态切换操作
Delphi中使用私有方法GetPriority和SetPriority获取和设置线程优先级(封装Windows API的GetThreadPriority和Set-ThreadPriority)。但动态改变线程的优先级对线程的执行有潜在的危险,不慎重地提高优先级可能会造成处理器资源分配的不合理,使某些线程始终得不到处理器时间。最好是在线程构造器中创建线程对象后初始化正确的线程优先级。当用户需要挂起运行线程时,通过公有方法Suspend设置线程挂起标记,调用API函数SuspendThread挂起执行线程。唤醒线程时,使用封装了API函数Re-sumeThread的公有Resume方法实现。运行的线程是可以多次挂起和重新执行的。
2.3线程间的同步
多个线程在同一进程空间内共享进程资源带来方便的同时,也不可避免的带来各线程间的同步问题。在Delphi环境内,有些对象对于多线程应用不一定是安全的,其中,带Session部件的数据库组件、图形对象(如Tfont、Tpen、Canvas等)、对象的构造和析构本身、分配内存等是线程安全的。而可视组件库VCL中有关图形设备接口GDI的属性和方法不是线程安全的。
三、结束语
本文描述了多线程的概念及在Delphi环境中的多线程机制,剖析了Delphi的线程类的实现过程,为设计有关Delphi的相关程序打下了一定的基础。