2009-07-24 18 views
6

używam SetTimer API i widzę dużo kodu tak:Czy KillTimer jest konieczny?

case WM_DESTROY: 
    // Destroy the timer. 
    KillTimer(hwnd, IDT_TIMER); 
    PostQuitMessage(0); 
    break; 

Czy muszę zadzwonić KillTimer lub system automatycznie wolnych zasobów na wyjściu procesu? Czy zapomnienie połączenia z KillTimer prowadzi do wycieku zasobów?

Rozumiem, że jeśli timer nie jest potrzebny, MOŻE zostać zniszczony przez KillTimer. Ale MUSI być niszczone ręcznie?

+0

Zrobiłem kilka badań i okazało się: Wnen okno jest niszczony procedury oczyszczania są wywoływane (DestroyWindowsTimers z xxxFreeWindow rozmowy). –

Odpowiedz

7

Zegary ustawione z HWND są niejawnie niszczone przez zniszczone okno (hwnd). Więc nie, nie musisz czyścić liczników, kiedy okno wychodzi.

Ale dobrze jest mieć wszystkie zasoby związane z oknem wyczyszczonym w oknie.

4

Programator zostanie automatycznie zniszczony przez system Windows podczas zamykania procesu.

Pamiętaj jednak, że (tak się wydaje) Twój zegar należy do okna, a nie do procesu. Więc jeśli twoja aplikacja pozwala na tworzenie i niszczenie tych okien w procesie, będziesz nieuchronny.

Zawsze dobrą praktyką jest wyraźne czyszczenie, ponieważ w przeciwnym razie brak czyszczenia może wrócić do gry.

+0

Nie sądzę, że to jest prawidłowe, aby powiedzieć, że czasomierze wyciekają, gdy okno zostanie zniszczone. Może w starym Windows 95/98 dni, zegar może przeciekać. Ale zdecydowanie na XP i wyżej, timery ustawione na hwnds są czyszczone, gdy okno jest niszczone. – selbie

+2

@selbie: Tak, jestem pewien, że masz rację. Ale nadal uważam, że dobrą praktyką jest zakładanie, że rzeczy wyciekną, chyba że je oczyścisz. Wyobraź sobie, że zmieniasz zegary z okien na oparte na okienkach zwrotnych - wtedy będziesz miał wyciek, chyba że wyraźnie je zabijesz. – RichieHindle

0

Zgodnie z MSDN, trzeba zabić liczniki:

Wnioski należy użyć funkcji KillTimer zniszczyć liczniki że nie są już konieczne. Poniższy przykład niszczy liczniki identyfikowane przez stałe IDT_TIMER1, IDT_TIMER2 i IDT_TIMER3.

// Zniszcz liczniki.
KillTimer (hwnd, IDT_TIMER1);
KillTimer (hwnd, IDT_TIMER2);
KillTimer (hwnd, IDT_TIMER3);

https://msdn.microsoft.com/en-us/library/windows/desktop/ms644901(v=vs.85).aspx#creating_timer

+0

Tak, ale jeśli twój timer ma takie samo życie jak okno, możesz pominąć 'KillTimer'. –