2011-09-21 6 views
3

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; 

는 가상 아니기 때문에 당신이

+1

디자인이 잘못되었습니다. 그리고 TerminateThread를 호출하는 것은 나쁘다. 매우 간헐적이며 디버깅이 불가능한 오류가 예상됩니다. 당신의 가장 중요한 고객들을 위해 그들이 일어날 것을 기대하십시오 !! –

+0

@DavidHeffernan, 동의하지만 WinSock 소켓을 차단하는 데 문제가 있습니다. 아주 특별한 경우에 즉시 응용 프로그램을 종료해야하며 [연결] (http://msdn.microsoft.com/en-us/library/ms737625%28v=VS.85%29.aspx) API 함수 진행 중입니다. 이 기능의 제한 시간은 약 20 초이며이 설정은 시스템 구성에서 가져옵니다. 예기치 않은 문제가 발생할 수 있지만 블로킹 소켓을 기반으로 한 대형 시스템이 있으며 즉시 스레드를 종료해야합니다. – TLama

+2

다른 스레드 컨텍스트에서 소켓을 닫는 것만으로'connect()'를 중단시킬 수 있습니다. –

답변

10

당신은 Free을 재정의 할 수 없습니다 감사합니다. 자신의 Free 메서드를 정의하면 정적 형식이 클래스 형식 인 경우 TObject.Free 메서드가 숨겨집니다 (컴파일러 경고). 이것은 결코 객체가 파괴되지 않기 때문에 좋은 생각이 아닙니다.

왜 그렇게하고 싶지는 않습니다. 당신이 정말TerminateThread를 사용하려는 경우, 당신의 스레드 클래스 당신이 TerminateThread를 호출하는 다른 방법 ForceTerminate를 제공합니다.

+0

설명해 주셔서 감사합니다. 나는'ForceTerminate'와 같은 것을 생각하고있었습니다. 어쨌든 '그 물체는 결코 파괴되지 않을 것'이라는 것이 사실입니까? 내가 상속받은 자유라고 부르면 그것은 틀렸을까요? – TLama

+0

@ michael85 - 오신 것을 환영합니다. 내가 이해하는 한,'상속받은'은 오버라이드를 사용하는 경우에만 작동하며, 그렇지 않은 경우에만 작동합니다. – jpfollenius

+0

'상속받은'FreeType'을 호출하여 실제로'TMyThread.Destroy;'메소드에 들어가기 위해'상속받은'메소드가 overriden되지 않았 음을 제외하고 ancestor의 메소드를 호출하고 있습니다. 그리고 당신은 물론 '오버라이드 (override)'에 대해 맞습니다. 오타였습니다. 필자의 설정으로는'E2170 비 가상 메소드를 오버라이드 할 수 없다. '라는 에러 메시지 때문에 컴파일 할 수 없다. 나는 System.pas 관점에서 보면 안전하다는 점에 초점을 맞추고있다. – TLama

관련 문제