如何在delphi中杀死一个线程?

时间:2010-10-28 16:10:17

标签: delphi

在delphi中,TThread中的方法终止。似乎subthread不能通过调用terminate或free来杀死另一个线程。 例如 A(主要形式),B(线程单位),C(另一种形式)。

B正在向主窗体和C发送数据(通过调用syncronize),我们尝试通过调用B.terminate在B执行时终止B。但是这种方法不起作用,B仍在工作,直到它以execute方法结束。

请帮忙。提前谢谢。

5 个答案:

答案 0 :(得分:43)

您必须在线程中检查Terminate才能使其正常工作。例如:

procedure TMyThread.Execute;
begin
  while not Terminated do begin
    //Here you do a chunk of your work.
    //It's important to have chunks small enough so that "while not Terminated"
    //gets checked often enough.
  end;
  //Here you finalize everything before thread terminates
end;

有了这个,你可以打电话

MyThread.Terminate;

一旦完成处理另一部分工作,它就会终止。这被称为“优雅的线程终止”,因为线程本身有机会完成任何工作并准备终止。

还有另一种方法,称为“强制终止”。你可以打电话:

TerminateThread(MyThread.Handle);

执行此操作时,Windows会强制停止线程中的所有活动。这不需要检查线程中的“Terminated”,但可能非常危险,因为你在操作过程中杀死了线程。之后您的应用程序可能会崩溃。

这就是为什么你绝对不会使用TerminateThread,直到你完全确定你已经找到所有可能的后果。目前你没有,所以使用第一种方法。

答案 1 :(得分:14)

实际上,

目前对这个问题的最多投票答案是不正确的(因此有34名赞助人......)关于如何强行杀死一个帖子。

使用ThreadId作为TerminateThread程序的参数。使用ThreadId将导致很可能出现“无效句柄”错误,或者更糟糕的情况是使用场景 - 会杀死另一个帖子。

您应该传递thread handle作为参数:

TerminateThread(MyThread.Handle);

有关线程句柄和ID之间差异的更多信息,请参见here

修改

似乎@himself在看到我的答案后纠正了他的错误,所以这已经不再适用了。

答案 2 :(得分:12)

终止不会杀死一个线程;它设置Terminated属性以通知线程它需要终止。线程有责任关注Terminated并优雅地关闭自己。

答案 3 :(得分:3)

所有Terminate方法都将Terminated属性设置为true。因此,您必须手动继续检查该属性,然后在设置为true时退出线程方法。

答案 4 :(得分:0)

如果您可能想要终止一个线程,那么您可能最好再生成另一个应用并杀死它,如果您认为它失败了 - 那么窗口将在您之后整理。