我在学习多线程编程,遇到一个问题不解,请大家帮忙解答,谢谢我建立一个线程类:
=======================================type
TMyThread = class(TThread)
private
fMyObjectInHeap: TStringList;
protected
procedure Execute; override; { 略 }
public
constructor Create;
destructor Destroy; overide; { 略 }
end;implementationconstructor TMyThread.Create;
begin
inherited Create(True);
fMyObjectInHeap := TStringList.Create;
end;=======================================我想请教一下:
1.如果一个线程的父线程(不是主线程,是主线程的子线程)中止,则该线程是否仍然执行?
2.在上面表示的线程的实例运行时,如果fMyObjectInHeap对象究竟是在进程的空间分配
的,抑或是在父线程的堆栈中分配的,还是在该实例自身的堆栈中分配的。 事实上我想知道的是当,ThreadA(不是主线程)创建了MyThread: TMyThread,当ThreadA
中止时,MyThread是否仍然在运行,并可以访问到Self.fMyObjectInHeap而没有页保护错误?
还有就是,当MyThread中止时(即使是TerminateThread调用引起), fMyObjectInHeap占用
的空间自动释放?
=======================================type
TMyThread = class(TThread)
private
fMyObjectInHeap: TStringList;
protected
procedure Execute; override; { 略 }
public
constructor Create;
destructor Destroy; overide; { 略 }
end;implementationconstructor TMyThread.Create;
begin
inherited Create(True);
fMyObjectInHeap := TStringList.Create;
end;=======================================我想请教一下:
1.如果一个线程的父线程(不是主线程,是主线程的子线程)中止,则该线程是否仍然执行?
2.在上面表示的线程的实例运行时,如果fMyObjectInHeap对象究竟是在进程的空间分配
的,抑或是在父线程的堆栈中分配的,还是在该实例自身的堆栈中分配的。 事实上我想知道的是当,ThreadA(不是主线程)创建了MyThread: TMyThread,当ThreadA
中止时,MyThread是否仍然在运行,并可以访问到Self.fMyObjectInHeap而没有页保护错误?
还有就是,当MyThread中止时(即使是TerminateThread调用引起), fMyObjectInHeap占用
的空间自动释放?
1、当MyThread中止时,fMyObjectInHeap占有的空间并不会自动释放,除非你自己去Free它。
2、ThreadA(不是主线程)创建了MyThread,当ThreadA中止时,MyThread依然可以运行,这是毫无疑问的,你可以访问MyThread线程局部存储的的变量以及全局变量。
to pazee, 我还有个疑问,你的意思是:Win32只为线程分配栈,而堆则在整个进程范围内共享吗?
数据段一般是主线程的全局静态变量的存在的地方,
函数内的局部变量大部分都是在堆里面,这个堆是按照B+树来建立的数据表。
函数内动态创建的东西一定在堆上,
pascal 不支持在栈或者数据段建立对象实例,只能在堆上。堆对于整个进程是只有一个的,里面的数据是否能共享,还是要看你变量的有效范围,和对对本身关系。