Delphi 스레드의 종료

2010 단어 Delphi
루틴 대상의 Execute () 가 실행되면, 이 루틴이 종료되었다고 생각합니다.이 경우 Delphi의 표준 루틴 EndThread () 를 호출하고, 이 루틴은 API 함수 ExitThread () 를 호출합니다.ExitThread()로 스레드가 차지하는 스택을 지웁니다.
TThread 대상을 끝낼 때, 이 Delphi 대상을 메모리에서 지웠는지 확인해야 합니다.그래야 모든 메모리 점유율을 확보할 수 있다.프로세스가 종료될 때 모든 스레드 대상을 자동으로 지우지만, 사용하지 않는 대상을 제때에 제거하면 메모리의 사용 효율을 높일 수 있습니다.FreeOnTerminate의 속성을 True로 설정하는 방법으로 스레드 객체를 적시에 지울 때 가장 편리한 방법은 Execute()가 종료되기 전에 설정하면 됩니다.다음과 같이 설정합니다.
procedure TTestThread.Execute;

var

    i: Integer;

begin

    FreeOnTerminate:= True;

    for i:=1 to 2000000 do

        inc(Answer, Round(Abs(Sin(Sqrt(i)))));

end;


이렇게 하면 한 라인이 종료될 때 OnTerminate 이벤트를 터치하고 이벤트 처리 과정에서 라인 대상을 제거할 기회가 생깁니다.
팁: OnTerminate 이벤트는 주 스레드 환경에서 발생합니다.이것은 이 사건을 처리하는 과정에서 Synchronize () 를 빌려 VCL에 자유롭게 접근할 필요가 없다는 것을 의미한다
 
Execute () 를 기억하려면 Terminated 속성의 값을 자주 검사해서 미리 종료할지 확인해야 합니다.비록 이것은 라인을 사용할 때 더 많은 것에 관심을 가져야 한다는 것을 의미하지만, 라인이 끝날 때 필요한 제거를 완성할 수 있도록 보장할 수 있다.다음은 Execute()에서 처리 작업을 추가하는 간단한 코드입니다.
procedure TTestThread.Execute;

var

    i: Integer;

begin

    FreeOnTerminate:= True;

    for i:= 1 to 2000000 do 

    begin

        if Terminated then

            break;

        inc(Answer, Round(Abs(Sin(Sqrt(i)))));

    end;

end;


일부 긴급한 경우, Win32 API 함수인TerminateThread () 를 사용하여 라인을 종료할 수 있습니다.하지만 다른 방법이 없으면 사용하지 마세요.예를 들어 코드 코드가 사순환에 빠지면TerminateThread()에 대한 설명은 다음과 같습니다.
function TerminateThread(hThread: THandle; dwExitCode: DWORD);


TThread의Handle 속성은 첫 번째 인자로 사용할 수 있기 때문에TerminateThread () 는 항상 이렇게 호출됩니다
TerminateThread(MyHosedThread.Handle, 0);


만약 이 함수를 선택한다면, 그것의 부정적인 영향을 고려해야 한다.우선, 이 함수는 Windows NT와 Windows 95/98에서 같지 않습니다.윈도 95/98에서 이 함수는 라인이 차지하는 창고를 자동으로 제거할 수 있습니다.Windows NT에서는 프로세스가 종료되기 전까지 스택이 유지됩니다.그 다음에, 루틴 코드에try가 있든 없든...finally 블록, 이 함수는 라인의 실행을 즉시 중지합니다.이것은 라인에 의해 열린 파일이 닫히지 않았고, 라인에 의해 신청된 메모리도 풀리지 않았다는 것을 의미한다.그리고 이 함수는 라인을 끝낼 때도 DLL에 알리지 않습니다. DLL이 닫힐 때 엔티 문제가 발생하기 쉽습니다

좋은 웹페이지 즐겨찾기