1.因为在同一个线程对象里,如果两次构造,将产生两个独立的线程,不但运行是独立的,而且使用线程的局部变量也是独立的、所以有下面的代码:(30分)
ThreadList为TList类型(下同)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
var
tbLoop:
Cardinal
;
KeyLoop:
Cardinal
;
tb:
string
;
Html:
string
;
tbs:TStringList;
newThread:TSearchTb;
begin
for
tbLoop :=
0
to
lstManagement
.
Count -
1
do
begin
tb:=lstManagement
.
Items[tbLoop];
newThread:=TSearchTb
.
Create(
True
);
newThread
.
TbName:=tb;
newThread
.
Html:=TbBasePath + tb;
newThread
.
Finish:=
False
;
newThread
.
Resume;
//开始执行
ThreadList
.
Add(@newThread);
//加入线程列表
end
;
newThread:=
nil
;
|
在这里、我的目的是创建出线程、我希望在这个过程结束时、线程并不结束、于是我就用一个TList对象来保存指针、
那么在这里、这个过程结束之前是否需要执行newThread.Free呢?
2.
有下面的函数、是将不需要的线程销毁掉(30分)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
var
i:
Integer
;
begin
for
i :=
0
to
ThreadList. -
1
do
begin
if
TThread(ThreadList
.
Items[i]^).ClassNameIs(
'TSearchTb'
)
then
begin
if
TSearchTb(ThreadList
.
Items[i]^).Finish
then
begin
TSearchTb(ThreadList
.
Items[i]^).Destroy;
//销毁线程
ThreadList
.
Delete(i);
//从列表中移除
end
else
begin
TDeleteTb(ThreadList
.
Items[i]^).Destroy;
//销毁线程
ThreadList
.
Delete(i);
//从列表中移除
end
;
end
;
end
;
end
;
|
可是执行到if TThread(ThreadList.Items[i]^).ClassNameIs('TSearchTb') then这一句就出现了内存方法错误的提示、这又是什么原因呢?我保存在里面我确认一定TThread类的、
3.我发现有一个TThreadList类、同样可以把TThread对象放在里面、可是我却不知道怎么获得保存在TThreadList类中的对象属性了、(没有Items属性)、我需要根据线程内的一个属性才能判断这个线程是否可以销毁的(30分)
暂时就想到这些、如果对我的描述有不清楚的地方可以问我、如果你都能回答出来90分就是你一个人的了
TThreadList只是一个线程访问安全列表类,它本身的作用不是用来保存线程对象的。
一般情况下,当线程对象的execute被执行完成之后(或被中止),缺省情况下,线程对象本身就会被自动释放掉;即使不释放它,线程对象也不能够再次被execute,所以保存线程对象是没有意义的。