Per utilizzare un timer in c++ su Windows bisogna invocare il metodo SetTimer(), definito in windows.h.

UINT_PTR SetTimer(
// handle alla finestra associata al timer
HWND hWnd,
// ID che vogliamo associare al timer
UINT_PTR nIDEvent,
// tempo del timer in millisecondi
UINT uElapse,
// metodo da invocare allo scattare del timer
TIMERPROC lpTimerFunc
);

L’argomento hWnd è un handle alla finestra associata al timer: per semplicità inizialmente lo impostiamo a NULL.

La funzione ritorna sempre un uint che indica l’ID del timer creato. Se hWnd è NULL il secondo parametro verrà ignorato e non possiamo associare direttamente un ID al timer; l’ID ci verrà ritornato dalla funzione, e se questo è diverso da zero allora il timer è stato creato con successo. Se invece hWnd non è nullo, l’ID del timer verrà assegnato con il parametro nIDEvent.

Aggiungiamo quindi una variabile globale dove salviamo l’ID del timer creato:

uint m_timerID;


Definiamo la funzione da invocare quando “scatta” il timer:

void CALLBACK OnTimer(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
// Inserire qui il codice da eseguire nell'evento OnTimer
}

e infine inseriamo l’inizializzazione del timer dove ci serve:

m_timerID = SetTimer(NULL, 1, (UINT)2500, (TIMERPROC)OnTimer);

In questo caso ho creato un timer che verrà scatenato ogni 2,5 secondi.
Per terminare il timer basta invocare la funzione KillTimer():

KillTimer(NULL, m_timerID);

Un altro modo interessante di utilizzare il metodo SetTimer() è quello di passare NULL al quarto parametro, lpTimerFunc:

m_timerID = SetTimer(hWnd, TIMER_ID, (UINT)2000, (TIMERPROC)NULL);

Dove hWnd è l’handle della nostra finestra. In questo caso per intercettare l’evento del timer bisogna necessariamente aggiungere nel metodo che smista i messaggi (la window procedure) il codice:

case WM_TIMER:
switch (wParam)
{
case TIMER_ID:
// Inserire qui il codice da eseguire nell'evento OnTimer
return 0;
}

In questo caso dobbiamo ricordarci che nel metodo KillTimer() dobbiamo anche passare l’handle della finestra:

KillTimer(hWnd, m_timerID);

Non mi resta che augurarvi buona programmazione tra 2,5 secondi!!! :f2:

Nel post “Classe Timer in c++” si trova una classe che fa da wrapper a queste funzioni.

kick it on DotNetKicks.com


Se sei interessato a questo post, potresti anche provare a leggere:

    No related posts