(200分)请问一下,在多线程中当关闭主程序是如何快速结束所有子线程(其中有一些线程在等待状态,无法正常退出此线程)(200)

  • 主题发起人 主题发起人 iyesno
  • 开始时间 开始时间
I

iyesno

Unregistered / Unconfirmed
GUEST, unregistred user!
(200分)请问一下,在多线程中当关闭主程序是如何快速结束所有子线程(其中有一些线程在等待状态,无法正常退出此线程)
 
哈哈,这个问题很典型,虽然很很多人用到线程,但线程很多人控制不好。 TCheLLXThread = class(TThread) private { Private declarations } FTask : TTask ;
FCamDHandle : THandle ;
FNowIndex : Integer ;
FSlpTime : Integer ;
Recbegin
: Cardinal ;
protected Function NowInRecTime : Boolean;
procedure Execute;
override;
public Constructor Create(CAMDHandle: THandle;Task:TTask ;ASlpTime : Integer);
procedure Stop;
end;
procedure TCheLLXThread.Stop;var H: array[0..1] of THandle;
begin
h[0] := self.Handle ;
Terminate;
WaitForSingleObject(H[0], INFINITE);
end;
在 Execute;
过程的循环中 while not terminateddo
beign end;
这个循环不要卡住,让它循环起来。结束时,调用STOP方法就行了。例如:等待一个事件发生procedure TUDPRecvThread.Execute;var dwRc: DWORD;
begin
while not Terminateddo
begin
dwRc := WSAWaitForMultipleEvents( 1, @FEvent, False, FSocket.FWaitForTime, False);
if Terminated then
Break;
{ if (dwRc = WAIT_IO_COMPLETION) or (dwRc = WSA_WAIT_FAILED) then
Break else
} begin
WSAResetEvent(FEvent);
if dwRc = WSA_WAIT_TIMEOUT then
begin
if Assigned(FSocket.FOnTimeOut) then
//设置处理多长时间没有收到数据 Synchronize(FSocket.FOnTimeOut);
end else
begin
if Assigned(FOnDataRecv) then
FOnDataRecv;
{ if Assigned(FOnDataRecv) then
Synchronize(FOnDataRecv);
} end;
end;
end;
end;
 
谢谢楼上的回答,你的这个方法不适用于我的程序。因为我的程序线程会调用一个第三方DLL的API,而这个API的返回很长,会卡住程序,大概80秒。就在这卡住的80秒时,要关闭程序,我想在关闭程序时结束这条线程。不知如何做!
 
如果这个API没有告诉你线程句柄,又是阻塞的。想关闭它比较难,设计这个API的人,应该提供方法结束线程的。你多看看SDK。不然这个API设计的失败。
 
直接用TerminateThread API 强制结束线程。
 

Similar threads

后退
顶部