2011-01-10 2 views
1

TScrollBox 내의 여러 프레임 (일반적으로 25)으로 구성된 인터페이스에 문제가 있습니다.Delphi : TList of Frames의 문제

이 두 문제는, 내가 하나가 다른의 결과가 바라고 ...

배경 : 응용 프로그램이 시작되면

, 나는 25 프레임, 약 포함하는 각을 만들 . 20 개의 컨트롤이 기본 정보로 채워집니다.

경우 : 사용자는

문제를 (검색이 < (25) 기록을 반환 할 수 있습니다로) 내 프레임을 내가 무료로하는 점에서 정보의 하위 집합으로 검색을 제한하고 다시 컨트롤을 클릭 할 수 나는 초기 검색 후 응용 프로그램을 종료 한 다음 약 소요됩니다. 5 초 후에 델파이로 돌아갑니다. 2 차 검색 후 (그리고 프레임을 처리/재 작성) 약 2 분이 걸립니다. 20 초)

프레임을 한 번만 만들도록 응용 프로그램을 다시 작성할 수 있지만, 무슨 일이 일어나고 있는지 알고 싶습니다. 여기

내 일상 만들 수 있습니다 :

procedure TMF.CreateFrame(i: Integer; var FrameBottom: Integer); 
var 
    NewFrame: TSF; 
begin 
    NewFrame := TSF.Create(Self); 
    NewFrame.Name := 'SF' + IntToStr(i); 
    if i = 0 then 
     NewSF.Top := 8 
    else 
     NewSF.Top := FrameBottom + 8; 
    FrameBottom := NewFrame.Top + NewFrame.Height; 
    NewFrame.Parent := ScrollBox1; 
    FrameList.Add(NewFrame); 
end; 

을 그리고 여기 내 삭제 루틴 : 나는 무엇을 놓치고

procedure TMF.ClearFrames; 
var 
    i: Integer; 
    SF: TSF; 
begin 
    for i := 0 to MF.FrameList.Count -1 do 
    begin 
     SF := FrameList[i]; 
     SF.Free; 
    end; 
    FrameList.Clear; 
end; 

은?

+0

어떤 유형의 FrameList입니까? BTF, ClearFrames에서 for 루프 내부의 MF.Framelist를 참조하고 있습니다. 여기 보지 마. –

+0

Framelist는 TMF Main Form의 Public 섹션에 선언 된 TList입니다. ClearFrames의 MF는 관계가 없지만 자체적으로 문제가 발생해서는 안됩니다. More Belt & Braces ... –

답변

1

생성중인 프레임의 메모리 할당을 Free'ing하여 제어하므로 생성자에서 Own 매개 변수로 Self를 제공 할 필요가 없습니다. 대신 소유자가 프레임을 비우지 않으려면 nil을 전달하십시오.

또한 ClearFrames 루틴의 모양이 마음에 들지 않습니다. 대신 다음을 시도하십시오 :

while FrameList.count > 0 do 
begin 
    TSF(Framelist[0]).free; 
    Framelist.delete(0); 
end; 
Framelist.clear; 
+0

제안 해 주셔서 감사합니다. 소유자 (nil)로 바뀌었고 위와 같습니다. 한 번 실행 한 후 또는 두 번 실행 한 후에도 여전히 10 초 차이가 있습니다 ... –

+1

FastMM 전체 디버그 모드를 사용하여 메모리 누수를 검사 했습니까? 이것은 문제를 지적 할 수 있으며, 이는 문제의 근본 원인이 될 수 있습니다. 어쩌면 이런 일이 나에게 일어났다 고 말할 수 있으며 디버깅 세션을 종료 할 때 ~ 10 초의 지연이 발생했습니다. – Stuart

+0

나는 아니었다. 그러나 무슨 일이 벌어지고 있는지보기위한 또 다른 경로일지도 모른다 ... –

1

귀하의 앱이 왜 그렇게 오래 걸리는지 알고 싶다면 프로파일 링을 시도하십시오. 프로그램에 대해 Sampling Profiler을 실행 해보십시오. 도움말 파일은 프로파일 링을 앱의 특정 섹션으로 제한하는 방법을 설명합니다.이 섹션을 사용하면 지우기 또는 부품 작성시 샘플링 결과 만 얻을 수 있습니다. 이렇게하면 실제로 대부분의 시간을 보내고 많은 추측을 할 수 있습니다.

+2

프로파일 링에 대한 매우 빠르고 더러운 대체 방법은 디버거에서 실행하는 것입니다. 장시간 실행중인 작업이 실행 중일 때 중단되거나 실행이 중단되거나 실행이 일시 중지되는 등의 문제가 발생합니다. 당신은 이것을 두 번하고 가난한 사람의 샘플링 프로파일 러와 같습니다. 정당한 이유없이 (또는 심지어 좋은 이유로) CPU 사용량이 많은 무언가가 있다면 보통 중간에 침입하여 실현이됩니다. –

+0

@David : 그렇습니다. 그러나 샘플링 프로파일 러는 무료이며 배우기 쉽고 사용하기 쉽기 때문에 "디버거 일시 중지 프로파일 링"메소드 IMO를 선호할만한 이유는별로 없습니다. –

+0

시도했을 때 제대로 작동하지 못했지만 너무 열심히 시도하지 않았다고 생각합니다. 적절한 도구가 있으면 좋겠지 만 "디버거 일시 중지 프로파일 링"방법은 몇 초 만에 작동 할 수 있습니다.어쨌든, 그것은 또 다른 옵션이었습니다. –