Free 메서드를 재정의하는 것이 안전합니까? 이런 식으로 사용하고 싶기 때문에 묻고 있습니다. TerminateThread을 사용하는 것은 매우 추한 것을 알고 있지만, 제 경우에는 모든 스레드가있는 프로세스를 즉시 종료하는 것이 매우 중요합니다.무료 메서드를 재정의하는 것이 안전합니까?
System.pas에 선언 된 __free 메소드를 보았지만 TObject.Free 메소드와 관련이 있는지 알 수 없습니다. 이것이 안전한지 묻는 이유입니다.
type
TMyThread = class(TThread)
private
destructor Destroy; override;
public
procedure Execute; override;
constructor Create;
procedure Free(const Force: Boolean = False); // is it safe to use this?
end;
procedure TMyThread.Free(const Force: Boolean = False);
begin
if not Force then
begin
Terminate;
WaitFor;
end
else
TerminateThread(Handle, 0);
inherited Free;
end;
destructor TMyThread.Destroy;
begin
// free resources etc.
inherited Destroy;
end;
는 가상 아니기 때문에 당신이
디자인이 잘못되었습니다. 그리고 TerminateThread를 호출하는 것은 나쁘다. 매우 간헐적이며 디버깅이 불가능한 오류가 예상됩니다. 당신의 가장 중요한 고객들을 위해 그들이 일어날 것을 기대하십시오 !! –
@DavidHeffernan, 동의하지만 WinSock 소켓을 차단하는 데 문제가 있습니다. 아주 특별한 경우에 즉시 응용 프로그램을 종료해야하며 [연결] (http://msdn.microsoft.com/en-us/library/ms737625%28v=VS.85%29.aspx) API 함수 진행 중입니다. 이 기능의 제한 시간은 약 20 초이며이 설정은 시스템 구성에서 가져옵니다. 예기치 않은 문제가 발생할 수 있지만 블로킹 소켓을 기반으로 한 대형 시스템이 있으며 즉시 스레드를 종료해야합니다. – TLama
다른 스레드 컨텍스트에서 소켓을 닫는 것만으로'connect()'를 중단시킬 수 있습니다. –