2009-07-24 3 views
6

Я использую SetTimer API, и я вижу много кода, как это:Необходим ли KillTimer?

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

Должен ли я позвонить KillTimer или система автоматически свободные ресурсы на выходе процесса? Не забываете ли вы вызвать KillTimer для утечки ресурсов?

Я понимаю, что если таймер не нужен, он может быть уничтожен KillTimer. Но ДОЛЖЕН быть уничтожен вручную?

+0

Я сделал некоторые исследования и выяснили: Wnen окно уничтожается очистки подпрограммы вызываются (DestroyWindowsTimers из xxxFreeWindow вызова). –

ответ

7

Таймеры, установленные из HWND, неявно уничтожаются при разрушении окна (hwnd). Так что нет, вам не нужно очищать таймеры, когда окно выходит.

Но это хорошая практика, чтобы все ваши ресурсы были связаны с окном, очищенным от закрытия окна.

4

Таймер будет автоматически уничтожен Windows при выходе из процесса.

Но имейте в виду, что (так кажется) ваш таймер принадлежит окну, а не процессу. Поэтому, если ваше приложение позволяет создавать и уничтожать эти окна в процессе, вы будете пропускать таймеры.

Это всегда хорошая практика, чтобы очистить вещи явно, потому что в противном случае отсутствие очистки может вернуться, чтобы укусить вас позже.

+0

Я не верю, что правильно сказать, что таймеры будут течь, когда окно будет уничтожено. Возможно, в старые Windows 95/98 дни может произойти утечка таймера. Но определенно на XP и выше, таймеры, установленные на hwnds, очищаются, когда окно уничтожается. – selbie

+2

@selbie: Да, я уверен, что вы правы. Но я все же говорю, что это хорошая практика предположить, что все будет течь, если вы не очистите их явно. Представьте, что вы переходите от оконных таймеров к основанным на обратном вызове - тогда у вас будет утечка, если вы явно не убьете их. – RichieHindle

0

Согласно MSDN, один должен убить таймеры:

Приложения должны использовать функцию KillTimer уничтожить таймеры больше не являются необходимыми. Следующий пример уничтожает таймеры , идентифицированные константами IDT_TIMER1, IDT_TIMER2 и IDT_TIMER3.

// Уничтожьте таймеры.
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

Да, но если ваш таймер имеет такое же время жизни, как и окно, вы можете опустить «KillTimer». –