Delphi中的线程类(2)2010-11-27猛禽首先就是构造函数:constructor TThread.Create(CreateSuspended: Boolean);
begin
inherited Create;
AddThread;
FSuspended := CreateSuspended;
FCreateSuspended := CreateSuspended;
FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
if FHandle = 0 then
raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);
end;
虽然这个构造函数没有多少代码,但却可以算是最重要的一个成员,因为线程就是在这里被创建的。在通过Inherited调用TObject.Create后,第一句就是调用一个过程: AddThread,其源码如下:procedure AddThread;
begin
InterlockedIncrement(ThreadCount);
end;
同样有一个对应的RemoveThread:procedure RemoveThread;
begin
InterlockedDecrement(ThreadCount);
end;
它们的功能很简单,就是通过增减一个全局变量来统计进程中的线程数。只 是这里用于增减变量的并不是常用的Inc/Dec过程,而是用了 InterlockedIncrement/InterlockedDecrement这一对过程,它们实现的功能完 全一样,都是对变量加一或减一。但它们有一个最大的区别,那就是 InterlockedIncrement/InterlockedDecrement是线程安全的。即它们在多线程 下能保证执行结果正确,而Inc/Dec不能。或者按操作系统理论中的术语来说, 这是一对“原语”操作。以加一为例来说明二者实现细节上的不同:一般来说,对内存数据加一的操作分解以后有三个步骤:1、从内存中读出数据2、数据加一3、存入内存