Newsgroup: it.comp.programmare.win32
Titolo: Il Timer di windows

Sto facendo un programma tipo "cronometro" che dovrebbe misurare i
millisecondi
durante i quali è stato attivo. Ho pensato di utilizzare SetTimer e creare
un evento
WM_TIMER ogni millisecondo. Ogni volta che che l'evento si verifica faccio
ridisegnare
la finestra con InvalidateRect e faccio scrivere il numero di ms passati.
Ora la mia
sorpresa è che 1000 messaggi vengono mandati in circa 10 sec. Allora ho
provato
a usare come precisione il secondo e il contatore è abbastanza preciso. Il
punto è questo: come posso ottenere la precisione di 1 ms? Utilizzando le
funzioni
di callback? e se si, come si fa?
grazie a chiunque voglia rispondermi

 la finestra con InvalidateRect e faccio scrivere il numero di ms passati.
Il problema di fondo e` che il ridisegno puo` richiedere piu` di un ms, e
quindi queste specifiche non sono in generale soddisfacibili.
Ci sono vari modi di avere precisione del millisecondo circa (multimedia
timers, waitable-timer kernel objects, ...), ma non ti servono se vuoi fare
ogni millisecondo una cosa che richiede anche solo 1.1 ms!-)
Alex

 ogni millisecondo una cosa che richiede anche solo 1.1 ms!-)
Innanzitutto grazie della risposta. Ho provato a fare un secondo programma
cosě strutturato (scusa se č lungo!)
 case WM_ACTIVATE:
  if((LOWORD(wParam)==WA_ACTIVE)||(LOWORD(wParam)==WA_CLICKACTIVE))
  {
   if(AppInit==0)
   {
    InitTimer()
    SetTimer(hWnd,2,1000,NULL);
    AppInit=1;
    TimerStart();
   }
   else
   {
    TimerStart();
   }
  }
  else if(LOWORD(wParam)==WA_INACTIVE)
  {
   TimerPause();
  }
  break;
 case WM_PAINT:
  {
   char temp[50];
   HDC  hDc;
   PAINTSTRUCT ps;
   sprintf(temp,"%d seconds elapsed",TimerGetElapsed());
   if (hDc=BeginPaint(hWnd,&ps))
       SetBkColor(hDc, RGB(0, 0, 255));
       SetTextColor(hDc, RGB(255, 255, 0));
       TextOut(hDc, 0, 0, temp, strlen(temp));
    EndPaint(hWnd,&ps);
   }
  }
  break;
 case WM_TIMER:
  if(wParam==1)
   TimerEvent();
  else
   InvalidateRect(hWnd,NULL,TRUE);
  break;
Nella sostanza il programma aggiorna ogni ms un contatore esterno mentre
ogni 1 s
ridisegna la finestra. Mi aspettavo che le visualizzazioni sarebbero state
1000-2000-3000-ecc.,
invece sono del tipo 300-800-1600-2450-3400-4300. Mi č sorto quindi un
dubbio:
ma il messaggio WM_TIMER viene aggiunto alla coda solo se questa č vuota?
Infatti credo che il codice contenuto nell'evento WM_TIMER venga eseguito in
molto
meno di un ms e anche se sta disegnando dovrebbe aggiungerli alla coda e poi
processarli tutti
uno dopo l'altro fino a ripareggiarsi col tempo. Spero di essere stato
chiaro e che tu mi possa
chiarire questo dubbio. grazie
ciao

 ma il messaggio WM_TIMER viene aggiunto alla coda solo se questa è vuota?
Viene servito a priorita` molto bassa e non se ne aggiungono piu` di
uno con lo stesso ID se uno e` gia` in coda.  Richter e` piuttosto
chiaro nella spiegazione di come la "coda" dei messaggi viene in
realta` realizzata entro Windows32, tra l'altro (varie cose sono
piu` dei flag che vere entry in coda, per intenderci).
Alex

Grazie della risposta. Per tutti quelli che hanno avuto il mio stesso
problema
esiste la funzione timeGetTime() che ritorna i millisecondi da quando è
in funzione win (fino a un massimo di 50 gg).
ciao

 esiste la funzione timeGetTime() che ritorna i millisecondi da quando č
