如何让一个线程迅速结束掉? ( 积分: 20 )

  • 主题发起人 主题发起人 行到水穷处
  • 开始时间 开始时间

行到水穷处

Unregistered / Unconfirmed
GUEST, unregistred user!
rt
这个线程里面有Sleep(5000);
 
rt
这个线程里面有Sleep(5000);
 
改成
fori i:=1 =10do
sleep(500);
 
suninrain:谢谢你。
请问这样可以不?
For内不用判断Terminated 属性可以吗?
我下面的程序加入了Terminated的判断
代码:
procedure TCollectIpListThread.MySleep(aTimeUnits: Integer);
var
  i: Integer;
begin
  for i := 0 to aTimeUnits -1do
  begin
    if Terminated then
      Break;
    sleep(100);
  end;
end;
 
直接把线程 Free 掉就行了。
 
Delphi syntax:
destructor Destroy;
override;
Description
Do not call Destroy in an application. Instead, use Free to destroy a thread when FreeOnTerminate is False.
Destroy signals the thread to terminate and then
waits for the thread to return before calling the inherited Destroy method.///////////free和Terminate不是一样吗?(看这段话 : Destroy signals the thread to terminate )
 
不一样的,Terminate 只是将线程的 Terminated 变量设置成 True 而已,是否退出还要看 Execute 中的代码,Free 则是直接将线程对象释放掉。可以在线程外用下面的语句:
FreeAndNil(线程实例名);
 
TerminateThread(Thread.Handle,0);
 
这个free会引发Thread Error 句柄无效。
代码:
        if GCollectIpThreadList.Count > 0 then
        begin
          if TCollectIpListThread(GCollectIpThreadList.Objects[0]) <> nil then
          TCollectIpListThread(GCollectIpThreadList.Objects[0]).Free;
        end;
我在TCollectIpListThread创建的时候是这样处理的
代码:
function StartCollect: Boolean;
var
  BTSTARTCollectIpListThread: TCollectIpListThread;
  tempThreadName,tempThreadPoint:string;
begin
  if GCollectIpThreadList.Count > 0 then
  begin
    Result := False;
    Exit;
  end;
  BTSTARTCollectIpListThread := TCollectIpListThread.Create(GStartIPC,GEndIPC,GPCName);
  tempThreadPoint := IntToStr(Integer(BTSTARTCollectIpListThread));
  tempThreadName :=  tempThreadPoint;
  GCollectIpThreadList.AddObject(tempThreadName,BTSTARTCollectIpListThread);
  Result := True;
end;
 
改成
for i := 1 to 1000do
begin
if Terminated then
Break;
sleep(5);
end;

如果要最快,还有一个办法。用一个事件句柄。
WaitForSingleObject(QuitEvent,5000);
其中
QuitEvent:THandle;
//可以为全局变量
QuitEvent := CreateEvent(nil,true,false,nil);
当你需要结束线程时
SetEvent(QuitEvent)
我的程序全部是这么做的。
 
多人接受答案了。
 
后退
顶部