X
XiDao
Unregistered / Unconfirmed
GUEST, unregistred user!
大多数的Delphi书籍中都提到过,VCL不是线程安全的,就是说,在
线程中不能简单的直接调用VCL内容,必须通过一些同步机制,使用主线
程来间接调用VCL内容。
但是书籍上却没有提到过Delphi的运行时刻库(Sysutils)函数是否
是线程安全的,能否重入。
在《Delphi4编程技术内幕》一书中P106(5.2线程:一个简单的例子)
中,作者在例子中建立如下线程,其中用到了IntToStr函数:
function ThreadFunc(pointer):LongInt;stdcall;
var
i:integer;
DC:HDC;
s:string;
begin
DC:=GetDC(Form1.Handle);
for i:=0 to 10000000do
begin
s:=IntToStr(i);
TextOut(DC,10,10,PChar(s),Length(S));
end;
ReleaseDC(Form1.Handle,DC);
end;
并用如下方式启动线程:
procedure TForm1.Button1Click(Sender: TObject);
var
hThread:THandle;
ThreadIDWORD;
begin
hthread:=CreateThread(nil,
0,
@THreadFunc,
nil,
0,
ThreadID);
if hthread=0 then
MessageBox(Handle,'NO Thread',nil,MB_OK);
end;
作者想通过这个例子来演示,如果使用了多线程,那么线程工作的时候,
程序仍能够很好的响应用户的输入操作,如拖动窗口移动等等。但是,不知道
作者想到过没有,如果连续按了两下Button1将会出现什么情况。
如果连续按了两下或者更多下Button1,则启动了多个循环显示的线程;
但是却出了很大的问题。在Win2000中报告,系统内存读取错误,这个错误就
是出在IntToStr这个函数上,看来这个函数重入时发生了错误!
Delphi的运行时刻库难道是不可重入的吗?就是说Delphi的基本函数
对线程来讲是不安全的吗?这个问题怎么解决?
线程中不能简单的直接调用VCL内容,必须通过一些同步机制,使用主线
程来间接调用VCL内容。
但是书籍上却没有提到过Delphi的运行时刻库(Sysutils)函数是否
是线程安全的,能否重入。
在《Delphi4编程技术内幕》一书中P106(5.2线程:一个简单的例子)
中,作者在例子中建立如下线程,其中用到了IntToStr函数:
function ThreadFunc(pointer):LongInt;stdcall;
var
i:integer;
DC:HDC;
s:string;
begin
DC:=GetDC(Form1.Handle);
for i:=0 to 10000000do
begin
s:=IntToStr(i);
TextOut(DC,10,10,PChar(s),Length(S));
end;
ReleaseDC(Form1.Handle,DC);
end;
并用如下方式启动线程:
procedure TForm1.Button1Click(Sender: TObject);
var
hThread:THandle;
ThreadIDWORD;
begin
hthread:=CreateThread(nil,
0,
@THreadFunc,
nil,
0,
ThreadID);
if hthread=0 then
MessageBox(Handle,'NO Thread',nil,MB_OK);
end;
作者想通过这个例子来演示,如果使用了多线程,那么线程工作的时候,
程序仍能够很好的响应用户的输入操作,如拖动窗口移动等等。但是,不知道
作者想到过没有,如果连续按了两下Button1将会出现什么情况。
如果连续按了两下或者更多下Button1,则启动了多个循环显示的线程;
但是却出了很大的问题。在Win2000中报告,系统内存读取错误,这个错误就
是出在IntToStr这个函数上,看来这个函数重入时发生了错误!
Delphi的运行时刻库难道是不可重入的吗?就是说Delphi的基本函数
对线程来讲是不安全的吗?这个问题怎么解决?