当某个线程完成后,在不将该线程对象消除的前提下,如何让它再次运行Execute?(50分)

  • 主题发起人 主题发起人 xinyonghu
  • 开始时间 开始时间
X

xinyonghu

Unregistered / Unconfirmed
GUEST, unregistred user!
当某个线程完成后,在不将该线程对象消除的前提下,如何让它再次执行Execute?
 
直接调用thread1.resume, 或者直接调用thread1.execute
 
我想知道,您说的这两种方法本质上是否相同?
我用resume试过好像没有执行Execute,但您说的后一种方法可以.
如果要用resume,使线程再次执行Execute,是否还需要些条件呢?
谢谢您了!
 
1.不可能,Execute完成后,系统就释放了线程的资源。
2.直接调用thread1.execute是在主线程中执行,没有任何意义。
 
to mywyn: 你看清楚,xinyonhu是说在线程对象还没消除的情况下,就是说他没有将
FreeOnTerminate设为true, 调用Resume是没用,因为它是让吊起的重新执行,而不是
全部执行,但Execute肯定有用
 
to 诸葛白痴:
请注意线程对象与线程的区别。只要Execute运行结束,windows就会释放线程的资源。
这也是公认的释放线程最好的方法。而Tthread的free方法只是释放线程对象的资源。
对于windows而言,线程早在Execute运行结束后就消失了。
 
同意楼上
FreeOnTerminate释放的是线程对象的资源
 
to mywyn:
请问:当FreeOnTerminate设为false时,调用thread1.execute
是否仍然在主线程中执行?
 
应该是的, 他只不过是一个普通的方法调用.
 
如果是这样的话,是否只有再create一次了呢?是否有其他的办法?
 
非常感谢大家,让我弄明白了一些问题
 
当然, 估计不会有其他方法了[:D]
 
只有再create了。
 
各位大哥,请看看delphi的thread的源代码在下结论:
实质上thread的resume和suspend是可以的,但是模拟的.
看看source什么都清楚了
 
如果需要频繁创建thread,你的thread不一定要立即退出,可以进行消息循环,
主线程用PostThreadMessage通知子线程需要干什么活
 
to jamstina:
Resume只不过是调用了ResumeThread,suspend也是调用了 SuspendThread,
如果线程都没了,调用它们还有什么意义呢?这是我的想法,请指正。
另,同意pipi,最好加个循坏。
 
可以学学TServerSocket那个Thread Pooling那个功能,用一个Event(CreateEvent)让一个线程
平时挂起,当要用到这个Thread时,将Event(SetEvent),将它唤醒,
让它继续工作(ClientExecute)
它的代码好像是这样写的:
ClientExecute是virtual;
abstract;
procedure Execute;
begin
while not Terminateddo
begin
if FEvent.WaitFor(INFINITE) then

ClientExecute;
if 是否是Pooling线程 then

break;
end;
end;

进入工作时,将SetEvent(Event),就可以重新运行ClientExecute方法了。
 
procedure Execute;
begin
while not Terminateddo
begin
if isWait then
suspend;
while (not isWait) and (not Terminated)do
begin
............
end;

end;
end;
如果你要像杀死线程那样的中止线程的运行isWait:=True就可以了!需要重新运行的时候就
isWait:=False;
resume;
真的要杀死线程你也应该知道怎么作!
 
to mywyn,
在windows(应该是任何操作系统)编程的概念中,调用suspend时候,该线程并没有被Kill
,只是操作系统将该thread的计数器(系统维护)+1。
个人认为循环最好不用,毕竟只要thread是活的,系统都会分配CPU和一定量的stack
如果suspend系统会把该线程用的资源放入“非运行” 级别保护。这样做是最节省系统
资源的。

 

Similar threads

后退
顶部