스레드의 Execute
메서드는 스레드의 Terminated
속성의 상태를 정기적으로 확인해야합니다. True
이면 스레드 Execute
메서드를 종료해야합니다.
그래서, 일반적인 Execute
방법은 다음과 같습니다 스레드가 동일한 작업을 수행하는 자신의 FActive
플래그가 같은
procedure TMyThread.Execute;
begin
while not Terminated do
DoNextPieceOfWork
end;
그것은 보인다. 그 문제는 TThread
이 그것에 대해 모른다는 것입니다. 따라서 FActive
을 없애고 대신 내장 메커니즘을 사용해야합니다.
스레드에서 Free
을 호출하면 Terminate
이 호출됩니다. 이는 Terminated
을 True
으로 설정합니다. 그런 다음 스레드 메소드가 종료 될 때까지 기다립니다. 이는 스레드가 Terminated
이 True
이고 종료 될 때 발생합니다. 그런 다음 스레드의 소멸자가 스레드를 정리하는 작업을 계속할 수 있습니다. 답변의 코드를 보면
, 더 나은 기존
Terminate
메커니즘을 사용하도록 작성된 것입니다.
type
TMyThread = class(TThread)
private
FTerminateEvent: TEvent;
protected
procedure Execute; override;
procedure TerminatedSet; override;
public
constructor Create(ACreateSuspended: Boolean);
destructor Destroy; override;
end;
constructor TMyThread.Create(ACreateSuspended: Boolean);
begin
inherited Create(ACreateSuspended);
FTerminateEvent := TEvent.Create(nil, True, False, '');
end;
destructor TMyThread.Destroy;
begin
inherited;
FTerminateEvent.Free;
end;
procedure TMyThread.TerminatedSet;
begin
FTerminateEvent.SetEvent;
end;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
// do somthing interesting!
FTerminateEvent.WaitFor(5000);
end;
end;
는 이제 별도의 Stop
방법에 대한 필요가 없습니다. 스레드에서 Free
으로 전화하면됩니다. 그런 다음 Terminate
이 호출됩니다. 그런 다음 TerminatedSet
이 호출됩니다. 그런 다음 이벤트가 신호됩니다. 그런 다음 Execute
이 종료됩니다. 그리고 실은 사라질 수 있습니다.
그런데 나는 5000ms 타임 아웃이 가장 좋은 방법이 될 수 있다고 생각하고있다. 왜 이렇게하는지 모르겠지만, 스레드가 실행되지 않도록 조절하려고하고있는 것 같습니다. . 바쁜 루프를 피하려고합니다. 감탄할만한 일이지만, 고정 타임 아웃을 사용하는 것은 그것을 할 수있는 방법이 아닙니다. 이를 수행하는 방법은 동기화 이벤트 (일반적으로 이벤트)를 기다리는 것입니다. 그런 다음 더 많은 작업이 완료되면 이벤트가 신호로 보내고 스레드가 깨어납니다.
확인이 아웃 : http://stackoverflow.com/questions/4044855/how-to-kill-a-thread-in-delphi – kostas
기술적으로 가능하지만, 정말 * 나쁜 생각 A *입니다. 실을 죽이지 말고 자살하라고하십시오. 올바른 해결책은 스레드가 플래그 (예 :'Terminated' 속성)를 충분히 자주 확인하도록하는 것입니다. – CodesInChaos
그리고 작업자 스레드를 잠자기 상태로 만들려면 해당 시간 동안 스레드가 수신 대기 중이므로 (종료 됨) sleep을 사용하지 마십시오. 예를 들어 이벤트 및 WaitForSingleObject를 사용하십시오. http://objectmix.com/delphi/402360-tthread-sleep-terminate.html ("델파이가 setevent를 종료 할 때 검색 됨") –