첫 번째 규칙은 스레드의 주 실행자 메소드가 신호를 보내고 올바르게 종료되도록 작성해야한다는 것과 두 번째 규칙은 앱의 메인 스레드를 먼저 종료하지 말아야한다는 것입니다. 자신의 시간에 다른 스레드가 종료되면 안전을 위해 모든 백그라운드 스레드가 중지되도록 신호를 보내고 종료가 완료 될 때까지 기다린 다음 주 스레드를 종료해야합니다. 최소한의 THREAD 예 :
procedure TMyThread.Execute;
begin
Init;
while not Terminated do
OneWorkItem; // inside OneWorkItem, you ALSO need to check for Terminated
end;
최소한의 기본 폼/메인 스레드 예 : 당신은 FPendingShutdownFlag을 설정하고 응용 프로그램 유휴 처리 루프에서 호출 위의 기능을 가질 수
procedure TMyMainForm.CheckAndShutdown;
begin
if FPendingShutdownFlag then
if AllBackgroundThreadsTerminated then
Self.Close;
end;
. 사용자가 FormClose 기본 폼을 클릭 할 때 AllBackgroundThreadsTerminated가 false를 반환하면 CanClose를 false로 설정하고 FPendingShutdownFlag := true
을 대신 설정하십시오.
무한 루프를 만들면 (사실이라면) 응용 프로그램이 정상적으로 종료되지 않습니다. 어떻게 든 응용 프로그램이 종료되고 실행중인 스레드가 갑자기 꺼지거나 교착 상태에 빠지거나 그렇지 않으면 실패 할 수 있습니다. 스레드 1의 리소스를 사용 중일 수 있으므로 스레드 1에서 해제 중입니다.
인터럽트 가능하도록 쓰레드 실행 메소드를 작성하지 않았거나, 메인 쓰레드와 VCL 및 그 객체의 종료를 시작할 수 있기 때문에 백그라운드 스레드가 다음과 같다면 의도 한 경쟁 조건이 하나 이상있을 수 있습니다. 완전히 닥쳐.
끊임없이 차단할 수있는 EnterCriticalSection 코드가 있습니까? 그것은 종료시에 바로 얻을 수있는 매우 일반적인 교착 상태입니다. –