关于TList(TThreadList)类和TThread类的一些疑问

forDream_ 2010-08-26 11:32:26
1.因为在同一个线程对象里,如果两次构造,将产生两个独立的线程,不但运行是独立的,而且使用线程的局部变量也是独立的、所以有下面的代码:(30分)
ThreadList为TList类型(下同)


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分)

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分就是你一个人的了
...全文
432 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
董董 2010-08-26
  • 打赏
  • 举报
回复
TThreadList只是一个线程访问安全列表类,它本身的作用不是用来保存线程对象的。

一般情况下,当线程对象的execute被执行完成之后(或被中止),缺省情况下,线程对象本身就会被自动释放掉;即使不释放它,线程对象也不能够再次被execute,所以保存线程对象是没有意义的。

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧