2011-01-10 13 views
1

Ich habe ein Problem mit einer Schnittstelle, die aus einer Anzahl von Frames (normalerweise 25) innerhalb einer TScrollBox besteht.Delphi: Probleme mit TList von Frames

Es gibt zwei Probleme, und ich hoffe, dass man eine Folge der anderen ist ...

Hintergrund:

Wenn die Anwendung startet, schaffe ich 25 Bilder, die jeweils ca. enthaltend . 20 Steuerelemente, die dann mit den Standardinformationen gefüllt werden. Der Benutzer kann dann auf einem Steuerelement klicken Sie auf die Suche auf eine Teilmenge der Informationen zu begrenzen, den Punkt, den ich meine Frames befreien und neu erstellen (wie die Suche < 25 Datensätze zurückgeben kann)

Das Problem:

Wenn Ich beende die Anwendung nach der ersten Suche, dann dauert es ca. 5 Sekunden, um nach Delphi zurückzukehren. Nach der 2. Suche (und dem Neuanlegen von Frames) dauert es ca. 20 Sekunden)

Während ich die Anwendung schreiben konnte, um nur die Rahmen einmal zu erstellen, würde ich gerne verstehen, was vor sich geht.

Hier ist meine schaffen Routine:

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; 

Und hier ist meine Löschroutine:

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; 

Was bin ich?

+0

Welcher Art ist FrameList? Übrigens, in ClearFrames beziehen Sie sich auf MF.Framelist innerhalb der for-Schleife. Sieht hier nicht richtig aus. –

+0

Framelist ist eine TList, die im Abschnitt Public des TMF-Hauptformulars deklariert wurde. Der MF in ClearFrames ist überflüssig, sollte aber an sich keine Probleme verursachen. Mehr Belt & Braces ... –

Antwort

1

Da Sie die Kontrolle über die Speicherzuweisung der Frames übernehmen, die Sie erstellen, indem Sie sie freigeben, müssen Sie Self nicht als Besitzerparameter im create-Konstruktor angeben. Übergeben Sie stattdessen nil, um zu verhindern, dass der Besitzer versucht, den Rahmen freizugeben.

Auch mag nicht das Aussehen Ihrer ClearFrames-Routine. Versuchen Sie dies stattdessen:

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

Vielen Dank für die Vorschläge. Auf Owner (nil) und das Obenstehende umgeschaltet und es gibt immer noch einen 10 Sekunden Unterschied zwischen dem Beenden nach einem oder zwei Runs ... –

+1

Haben Sie den FastMM Full Debug Modus benutzt, um nach Speicherlecks zu suchen? Dies könnte auf ein Problem hinweisen, das wiederum die Ursache für ein Problem sein kann. Sie können vielleicht sagen, dass mir das passiert ist und es verursachte eine ~ 10 Sekunden Verzögerung beim Beenden einer Debugsitzung. – Stuart

+0

Ich war nicht - aber es könnte eine andere Route sein, um zu sehen, was vor sich geht ... –

1

Wenn Sie wissen möchten, warum Ihre App so lange braucht, um etwas zu tun, versuchen Sie es mit einem Profiling. Versuchen Sie Sampling Profiler gegen Ihr Programm laufen. Die Hilfedatei erläutert, wie Sie das Profiling auf nur einen bestimmten Bereich Ihrer App beschränken können, mit dem Sie nur Sampling-Ergebnisse zum Löschen oder Erstellen von Teilen erhalten können. Dies sollte Ihnen zeigen, wo Sie die meiste Zeit verbringen und viel Rätselraten daraus machen.

+2

Eine sehr schnelle und schmutzige Alternative zur Profilerstellung besteht darin, unter dem Debugger zu laufen, während die lang andauernde Operation stattfindet, die Ausführung zu unterbrechen, die Ausführung zu pausieren oder was auch immer aufgerufen wird. Du machst das ein paar Mal und es ist wie der Sampler Profiler des armen Mannes. Wenn es etwas gibt, das unerhört viel CPU verbraucht, ohne einen guten Grund (oder sogar aus gutem Grund!), Dann brechen Sie normalerweise mitten hinein und es dämmert die Erkenntnis. –

+0

@David: Ja, aber da Sampling Profiler ist kostenlos und leicht zu erlernen und zu verwenden, gibt es wirklich keinen Grund, die "Debugger Pause Profiling" -Methode IMO bevorzugen. –

+0

Ich konnte es nicht zum Laufen bringen, als ich es versuchte, aber ich denke, ich habe mich nicht zu sehr bemüht. Ich stimme zu, dass es sich lohnt, die richtigen Tools zu verwenden, aber oft kann die Methode "Debugger-Pause-Profiling" innerhalb weniger Sekunden funktionieren.Wie auch immer, es war nur eine andere Option. –

Verwandte Themen