2011-01-10 3 views
1

TScrollBox内の多数のフレーム(通常は25)からなるインターフェイスに問題があります。Delphi:TList of Framesの問題

あり2つの問題がある、と私は一方が他方の結果であることを期待しています...

背景:アプリケーションが起動すると

が、私は25のフレーム、約それぞれ含むを作成。 20個のコントロールが表示され、デフォルトの情報が入力されます。ユーザー(検索が< 25レコードを返すことのように)、私は解放された時点での情報のサブセットに検索を制限し、私のフレームを再作成するコントロールに

をクリックすることができます問題:

の場合私は最初の検索の後にアプリケーションを終了してから約2時間かかる。 Delphiに戻るには5秒。 2回目の検索(およびフレームの廃棄/再作成)後には、 20秒)

フレームを1回だけ作成するようにアプリケーションを書き直すことができましたが、何が起こっているのか理解したいと思います。

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ですか?ところで、ClearFramesでは、forループ内のMF.Framelistを参照しています。ここでは見えません。 –

+0

フレームリストは、TMFメインフォームのパブリックセクションで宣言されたTListです。 ClearFramesのMFは無関係ですが、それ自体問題はありませんか? More Belt&Braces ... –

答えて

1

作成しているフレームのメモリ割り当てを自由に制御するので、作成コンストラクタでオーナーパラメータとしてSelfを指定する必要はありません。代わりにnilを渡して、所有者がフレームを解放しようとしないようにします。

また、ClearFramesルーチンの外観が気に入らないようにしてください。代わりにこれを試してみてください:

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

提案をお寄せいただきありがとうございます。所有者(nil)と上記に切り替えられ、1回の実行後または2回後に終了する間に10秒の差があります。 –

+1

FastMMフルデバッグモードを使用してメモリリークを調べましたか?これは問題を指している可能性があります。これは、問題をさらに深刻化させる根本的な原因となる可能性があります。これは私に起こったと言えるかもしれませんし、デバッギングセッションを終了するのに〜10秒の遅れが生じました。 – Stuart

+0

私はそうではありませんでしたが、何が起こっているのかを見る別のルートかもしれません... –

1

あなたのアプリが何かをするのに時間がかかっている理由を知りたいのであれば、それをプロファイリングしてみてください。あなたのプログラムに対してSampling Profilerを実行してみてください。ヘルプファイルには、プロファイリングをアプリケーションの特定のセクションに限定する方法が説明されています。このセクションを使用して、クリアまたは部品作成のサンプリング結果のみを取得することができます。これは、あなたが実際にあなたの時間のほとんどを費やしている場所を示して、それから推測をたくさん取るべきです。

+2

プロファイリングの非常に迅速で汚れた代替手段は、デバッガの下で実行することです。また、長時間実行されている操作が実行されている間、実行が中断されたり、実行が中断されたり、あなたはこれを数回行い、それは貧しい人のサンプリングプロファイラのようなものです。正当な理由がない(または正当な理由があっても)CPUを消費しているようなものがあれば、通常はその真ん中に入り込み、実現が始まります。 –

+0

@David:はい、しかし、サンプリングプロファイラは無料で、習得しやすく使いやすいので、 "デバッガポーズプロファイリング"メソッドIMOを好む理由はあまりありません。 –

+0

私はそれを試してみるとうまくいかなかったが、あまりにも頑張っていないと思う。私は、適切なツールを持っていることには同意しますが、「デバッガのポーズプロファイリング」メソッドはほんの数秒で動作します。とにかく、もう一つの選択肢でした。 –

関連する問題