第三、如何开发多线程的程序?
编写基于线程的程序,既可以使用Windows提供的API函数,也可以使用Delphi提供的线程对象。而使用Delphi的线程对象(TThread对象),则可使编写线程程序变得简单、高效。TThread对象提供了许多特性和方法(成员函数),它类将Windows API函数中关于多线程方面的函数封装到了一起,你只要根据工作需要对这些函数或方法进行重写,即可在程序中实现多线程机制。Tthread类是TObject对象的直接派生类。与其它大多数Delphi类和构件不同的是,你不能在程序中直接使用该对象,而必须从Tthread类产生一个新的派生类,并对需要使用的方法进行重写,以重载(Override)Tthread类的方法。
利用TThread类来编写多线程应用程序的一般步骤如下:
1.从TThread类派生出一个新的线程类。
2.创建线程对象。
3.设置线程对象的属性,比如优先级等。
4.根据具体情况挂起或唤醒线程。
5.结束线程。
在Delphi中,你既可以通过直接书写线程代码来创建线程,也可以Delphi的File菜单的New命令向当前项目文件加入一个线程对象来实现。两者结果都一样,都是产生一个Tthread类的派生类,下面就使用后一种方法进行说明。
选择File菜单的New命令,打开New Items对话框,选择New页标签下的Thread Object图标(如图1所示),打开New Thread Object对话框(如图2所示)。在New Thread Object对话框的Class Name编辑框,输入创建线程的类名,然后选择OK按钮,则Delphi自动生成一个新的代码文件,该代码文件即为新线程类的代码文件
unit Unit2;
interface
uses
Classes;
type
test = class(TThread)
private
{ Private declarations }
protected
procedure Execute;
override;
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure test.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
}
{ test }
procedure test.Execute;
begin
{ Place thread code here }
end;
end.
该代码文件生成一个线程类的派生类,并提供了需要派生类覆盖的方法Execute说明。文件中还包含如何编写处理VCL构件方法的说明信息。下面就可以根据特殊的需要修改新的线程类了。
TThread类有一个构造函数Create,函数原型如下:constructor Create(CreateSuspended: Boolean);
其中参数CreateSuspended为一个布尔类型的变量。如果设置为False,则线程对象创建后立即调用TThread类的另一个过程Execute,也就是立即开始执行线程的操作;如果设置为True,则线程对象创建后,要调用过程Resume后线程的操作才开始。可以在TThread类的派生类中重新定义Create构造函数,用来对派生类中的一些属性进行初始化。
我们可以自己定义TThread类的派生类中的Execute过程,过程Execute中的代码就是线程要做的工作。如果Execute过程执行完毕,则该线程就结束了,并释放线程占用的栈空间。通常在Execute过程的重载函数中要有一个repeat…until语句,如:
procedure TSquareThread.Execute;
begin
……
repeat
…… // 具体的操作
until Terminated;
// 判断是否应该结束线程
……
end;
其中Terminated为线程类的一个属性,用来标志是否应该结束线程。