2009-07-24 18 views
6

Io uso API SetTimer e vedo un sacco di codice come questo:KillTimer è necessario?

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

Devo chiamare KillTimer o il sistema le risorse automaticamente gratuite in uscita del processo? Dimenticare di chiamare KillTimer porta a perdite di risorse?

Capisco che se il timer non è necessario, può essere distrutto da KillTimer. Ma DEVE essere distrutto manualmente?

+0

Ho fatto alcune ricerche e scoperto: le routine di pulizia wnen una finestra viene distrutta vengono invocati (DestroyWindowsTimers da xxxFreeWindow chiamata). –

risposta

7

I timer impostati da HWND vengono distrutti in modo implicito dalla finestra (hwnd) che viene distrutta. Quindi no, non è necessario pulire i timer quando la finestra si chiude.

Ma è una buona pratica avere tutte le risorse relative alla finestra pulite alla chiusura della finestra.

4

Il timer verrà distrutto automaticamente da Windows all'uscita del processo.

Ma tenete a mente che (così sembra) il vostro timer appartiene alla finestra, non al processo. Quindi se la tua applicazione consente di creare e distruggere queste finestre all'interno di un processo, perderai dei timer.

È sempre buona norma pulire le cose in modo esplicito, perché altrimenti la mancanza di pulizia può tornare a morderti più tardi.

+0

Non credo che sia corretto dire che i timer perdono quando la finestra viene distrutta. Forse nei vecchi Windows 95/98 giorni, un timer poteva perdere. Ma sicuramente su XP e su, i timer impostati su hwnds vengono ripuliti quando la finestra viene distrutta. – selbie

+2

@selbie: Sì, sono sicuro che hai ragione. Ma continuo a dire che è una buona pratica presumere che le cose si perderanno a meno che non le puliate esplicitamente. Immagina di passare da timer basati su finestre a quelli basati su callback, quindi si verificherà una perdita a meno che tu non li uccida esplicitamente. – RichieHindle

0

Secondo MSDN, si dovrebbe uccidere i timer:

Le applicazioni dovrebbero utilizzare la funzione di distruggere KillTimer timer che non sono più necessari. L'esempio seguente distrugge i timer identificati dalle costanti IDT_TIMER1, IDT_TIMER2 e IDT_TIMER3.

// Distruggi i timer.
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ì, ma se il timer ha la stessa durata di una finestra, è possibile omettere 'KillTimer'. –