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

Dyl*_*lan 20 delphi

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

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

请帮忙.先感谢您.

him*_*elf 45

您必须在线程中检查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;
Run Code Online (Sandbox Code Playgroud)

有了这个,你可以打电话

MyThread.Terminate;
Run Code Online (Sandbox Code Playgroud)

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

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

TerminateThread(MyThread.Handle);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不仅应用程序可能崩溃,而且thead使用的资源也不会被释放.TerminateThread()是一个"极值比"调用. (4认同)
  • @himself:当找到Terminated set为True时,你可以在线程上下文中调用线程"Abort"."中止"将引发一个无声的例外.有时这种方式比使用大型"while Terminated"循环更容易理解逻辑. (4认同)

Wod*_*dzu 15

其实,

目前,对这个问题的最多投票回答是不正确的(因此有34名upvoters ......)关于如何强行杀死一个线程.

使用ThreadId作为参数传递给TerminateThread程序.使用ThreadId将导致很可能是"无效句柄"错误或更糟糕的情况下scenerio将杀死不同的线程.

您应该将线程句柄作为参数传递:

TerminateThread(MyThread.Handle);
Run Code Online (Sandbox Code Playgroud)

有关线程句柄和id之间差异的更多信息,请点击此处.

编辑

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


Mas*_*ler 12

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