我的应用程序上有一个辅助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
答案 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 - [