Delphi 스레드의 종료
2010 단어 Delphi
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이 닫힐 때 엔티 문제가 발생하기 쉽습니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Delphi] TStringBuilder그리고 꼭 사용해야만 할까? 그림처럼 Heap 영역에 "Hello" 공간을 생성하고 포인팅을 한다. "Hello World" 공간을 새로 생성한 후 포인팅을 하게 된다. 결국 "Hello" 라는 String 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.