2009-07-24 31 views
6

Yo uso API SetTimer y veo un montón de código como este:¿Es necesario KillTimer?

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

¿Tengo que llamar KillTimer o el sistema automáticamente los recursos libres en la salida del proceso? ¿Olvidar llamar a KillTimer conduce a pérdidas de recursos?

Entiendo que si el temporizador no es necesario, puede ser destruido por KillTimer. ¿DEBE ser destruido manualmente?

+0

He hecho algunas investigaciones y descubrió: rutinas de limpieza wnen una ventana está siendo destruido se invocan (DestroyWindowsTimers de llamada xxxFreeWindow). –

Respuesta

7

Los temporizadores establecidos desde HWND se destruyen implícitamente al destruirse la ventana (hwnd). Así que no, no tienes que limpiar tus temporizadores cuando la ventana se cierra.

Pero es una buena práctica tener todos los recursos relacionados con la ventana limpiada en la ventana cerrada.

4

El temporizador se destruirá automáticamente por Windows al salir del proceso.

Pero tenga en cuenta que (por lo que parece) su temporizador pertenece a la ventana, no al proceso. Entonces, si su aplicación permite que se creen y destruyan estas ventanas dentro de un proceso, se perderán temporizadores.

Siempre es una buena práctica limpiar cosas de forma explícita, porque de lo contrario la falta de limpieza puede volver a morder más adelante.

+0

No creo que sea correcto decir que los temporizadores se filtrarán cuando se destruya la ventana. Quizás en los viejos días de Windows 95/98, un temporizador podría tener fugas. Pero definitivamente en XP y arriba, los temporizadores configurados en hwnds se limpian cuando se destruye la ventana. – selbie

+2

@selbie: Sí, estoy seguro de que tienes razón. Pero sigo diciendo que es una buena práctica suponer que las cosas se filtrarán a menos que las limpies explícitamente. Imagine que cambia de los temporizadores basados ​​en ventanas a los basados ​​en retrollamadas; entonces tendrá una fuga a menos que los mate de manera explícita. – RichieHindle

0

Según MSDN, hay que matar a los temporizadores:

aplicaciones deberían usar la función de destruir KillTimer temporizadores que ya no son necesarios. El siguiente ejemplo destruye los temporizadores identificados por las constantes IDT_TIMER1, IDT_TIMER2 e IDT_TIMER3.

// Destruye los temporizadores.
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

Sí, pero si su temporizador tiene la misma duración que una ventana, puede omitir 'KillTimer'. –

Cuestiones relacionadas