在使用WaitForMultipleObjects时如何终止线程

时间:2011-08-03 07:48:01

标签: multithreading delphi delphi-xe

我的应用程序上有一个辅助thead(TMyWaitFor),它执行一些工作线程(TFooThr)并等待使用WaitForMultipleObjects函数

这是相关代码

const
 nThreads=5;
//these arrays are declarated in the private section of the TMyWaitFor thread  
 tArr  : Array[1..nThreads]  of TFooThr;
 hArr  : Array[1..nThreads]  of THandle;

procedure TMyWaitFor.Execute;
Var
 i     : Integer;
begin
  for i:=1  to nThreads do
   begin
     tArr[i]:=TFooThr.Create(AValue);
     hArr[i]:=tArr[i].Handle;
   end;

  WaitForMultipleObjects(nThreads, @hArr[0], True, INFINITE);
end;

一切正常,但现在在某些情况下,我不能等待线程(TFooThr),我需要取消操作,所以我需要停止(终止)我在{{1开始的所有线程所以问题是TMyWaitFor.Execute

1 个答案:

答案 0 :(得分:4)

正如David建议的那样,在线程上调用Terminated并更改代码以定期检查终止标志:

procedure TMyWaitFor.Execute;
Var
  i     : Integer;
begin
  for i:=1  to nThreads do
  begin
    tArr[i]:=TFooThr.Create(AValue);
    hArr[i]:=tArr[i].Handle;
  end;

  while not Terminated do
    //wait half a second
    if WaitForMultipleObjects(nThreads, @hArr[0], True, 500) <> WAIT_TIMEOUT then 
      Break; 
end;

更新2011-08-03

大卫和塞尔格是正确的我害怕,我是不正确的。在TFooThr.Execute中你应该检查Terminated。在你的应用程序的主线程中,你可以在所有TFooThr上调用Terminate来杀死它们,只要它们注意到Terminated标志,那么TMyWaitFor将自动落空。

你应该删除你对这个答案的接受。

N - [