2013-03-21 8 views
5

Iは、(ICON1とICON2は.RESファイル内にある)スレッドでトレイアイコンをアニメーション化するために、このコードを使用しています:LoadIcon()でメモリリークが可能ですか?

while AnimationPending do 
begin 
    TrayIcon.Icon.Handle := LoadIcon(hInstance,'icon1'); 
    Sleep(300); 
    TrayIcon.Icon.Handle := LoadIcon(hInstance,'icon2'); 
    Sleep(300); 
end; 

私はそれを行う場合には、メモリリークを作成するおそれを有していますアイコン1/2がもう一度読み込まれるので、ループします。

コードでメモリリークが発生するか、ループで使用するのが安全ですか?

+0

私は知らないが、私はどのように伝えるべきか分かっている。プロセスエクスプローラ(www.sysinternals.com)を実行して10分間実行すると、漏れがあるかどうかを表示します。 –

+1

**スレッド**を使用してTrayIconをアニメーション化するポイントが得られませんでした。私は、ImageListとAnimateプロパティがTrueに設定されたアニメーションTrayIconを知っています –

+0

EmbaのTrayIconの例http://docwiki.embarcadero.com/CodeExamples/XE3/en/TTrayIcon_(Delphi) –

答えて

8

LoadIconに電話しています。共有アイコンと呼ばれるものが返されます。これはDestroyIconのマニュアルで説明されています。共有アイコンであることの結果の1つは、DestroyIconに電話する必要がないということです。 CreateIconFromResourceExLR_SHAREDフラグなし を呼び出した場合)、CreateIconIndirect、およびCopyIcon:アイコンやカーソルのDestroyIconを呼び出すために必要なだけである

は、次のような機能を持つ を作成しました。 この機能を使用して共有アイコンを破棄しないでください。共有アイコンは、ロードされたモジュールがメモリ内に残っている限り、 として有効です。以下の関数は、共有アイコンを取得します。

  • LoadIcon
  • LoadImage
  • CopyImage(あなたがLR_SHAREDフラグを使用する場合)(あなたはLR_COPYRETURNORGフラグとhImageパラメータを使用する場合、共有アイコンです)
  • CreateIconFromResource
  • (あなたが LR_SHAREDフラグを使用している場合)
  • CreateIconFromResourceEx

だから、これはどのようにあなたのコードに関連していますか?あなたは

TrayIcon.Icon.Handle := LoadIcon(hInstance,'icon1'); 

を書くときさて、あなたはTIconオブジェクトのHandleプロパティに割り当てています。そのTIconオブジェクトに既にアイコンが含まれている場合、そのアイコンは新しいアイコンに置き換えられる前に破棄されます。それはTIconがそのアイコンハンドルの所有権を持っているからです。これは、上記のコード行が共有アイコンのDestroyIconを呼び出すことを意味します。これは、MSDNがあなたにしないことを指示しているものですが、実際には良性であることが判明しています。それは心配するものではありません。

ここで、共有されていないアイコンを返す関数を使用していたとしても、 CreateIconIndirectあなたのコードはアイコンハンドルを漏らさないでしょう。これは、TIconクラスがアイコンハンドルの所有権を取得するためです。

共有アイコンを使用しているため、これらのハンドルをリークすることさえできません。破壊することができないオブジェクトは、漏出することはできません!

いくつかのより多くのポイント:

  1. 私は個人的に何度もそのようなLoadIconを呼び出すことはありません。私はプログラムの起動時に2回呼び出すと共有アイコンのハンドルを覚えています。次に、これらのハンドルを使用してTrayIcon.Icon.Handleに割り当てます。
  2. LoadIconに電話すると、返されるアイコンのサイズを多く制御することはできません。小さなアイコンではなく大きなアイコンが表示される可能性があると私は思います。そして、それは表示する前に小さなアイコンサイズにスケーリングする必要があります。通知領域アイコンを作成するときは、SM_CXSMICONSM_CYSMICONのサイズであることを確認する必要があります。
関連する問題