2013-03-21 17 views
5

używam tego kodu, aby animować ikonę w zasobniku w wątku (icon1 i icon2 są w pliku .res):Czy wyciek pamięci jest możliwy z LoadIcon()?

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

mam obawę, że może to powodować wyciek pamięci, jeśli mogę to zrobić w pętli, ponieważ icon1/2 są ładowane na nowo.

Czy kod tworzy wyciek pamięci, czy jest bezpieczny w użyciu w pętli?

+0

Nie wiem, ale wiem, jak powiedzieć. Uruchom go na 10 minut z uruchomionym Process Explorer (www.sysinternals.com), a wyświetli się, jeśli masz wyciek, czy nie. –

+1

Nie otrzymałem punktu za użycie ** wątku ** do animacji TrayIcon. Znam animowane TrayIcons z właściwością ImageList i Animate ustawioną na True –

+0

Przykład TrayIcon z Emba http://docwiki.embarcadero.com/CodeExamples/XE3/en/TTrayIcon_(Delphi) –

Odpowiedz

8

Dzwonisz pod numer LoadIcon. To zwraca tak zwane ikony wspólne. Zostało to wyjaśnione w dokumentacji dla DestroyIcon. Jedną z konsekwencji bycia wspólną ikoną jest to, że nie musisz dzwonić pod numer DestroyIcon.

Konieczne jest jedynie, aby zadzwonić DestroyIcon dla ikon i kursorów stworzony z następującymi funkcjami: CreateIconFromResourceEx (jeśli nazywa bez flagi LR_SHARED), CreateIconIndirect i CopyIcon. Nie używaj tej funkcji do niszczenia udostępnionej ikony. Ikona udostępniona jest ważna jako , o ile moduł, z którego został załadowany, pozostaje w pamięci. Poniższe funkcje uzyskują wspólną ikonę.

  • Loadlcon
  • LoadImage (jeśli użyć flagi LR_SHARED)
  • CopyImage (jeśli używasz LR_COPYRETURNORG flagi i parametr hImage jest wspólna ikona)
  • CreateIconFromResource
  • CreateIconFromResourceEx (jeśli użyć flagi LR_SHARED)

Tak, jak to się ma do kodu? Cóż, kiedy piszesz

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

jesteś przypisywanie do majątku TIcon obiektu Handle. Jeśli ten obiekt TIcon zawiera już ikonę, ikona zostanie zniszczona przed zastąpieniem przez nową ikonę. To dlatego, że TIcon ma własność uchwytów ikon. Wszystko to oznacza, że ​​linia kodu powyżej powoduje wywołanie DestroyIcon dla udostępnionej ikony. To właśnie MSDN mówi, aby nie robić, ale w rzeczywistości okazuje się być łagodny. Nie ma się czym martwić.

Teraz, nawet jeśli używasz funkcji zwracającej niewspółużytkowane ikony, np. CreateIconIndirect wtedy twój kod nie wyciekłby uchwytów ikon. Dzieje się tak, ponieważ klasa TIcon przejmuje własność uchwytu ikony.

Ale ponieważ używasz wspólnych ikon, nie ma możliwości wycieku tych uchwytów.Obiekty, których nie można zniszczyć, nie mogą wyciec!

Niektóre więcej punktów:

  1. Ja osobiście nie nazwałbym LoadIcon kółko tak. Nazwałbym go dwukrotnie przy uruchomieniu programu i pamiętam współdzielone ikony. Następnie użyłbym tych uchwytów, aby przypisać do TrayIcon.Icon.Handle.
  2. Po wywołaniu LoadIcon nie masz dużej kontroli nad wielkością zwróconej ikony. Myślę, że jest możliwe, że otrzymasz dużą ikonę zamiast małej ikony. I trzeba będzie przeskalować do małego rozmiaru ikony przed wyświetleniem. Tworząc ikony obszaru powiadomień, należy upewnić się, że są one o rozmiarach SM_CXSMICON według rozmiaru: SM_CXSMICON.