2009-04-29 17 views
6

Sto usando il codice qui sottoC# Thread.Sleep risveglio subito

Thread.Sleep(5); 

alla fine di un ciclo while. Per cercare di ottenere un ritardo di 5 ms tra le iterazioni.

A volte dorme per 16 ms. Questo lo capisco e lo accetto, poiché dipende da quando la CPU si mette al servizio del thread. Tuttavia, una volta che ha risvegliato l'iterazione successiva, sembra svegliarsi immediatamente dopo la chiamata a riposo (sto registrando i timestamp). C'è un problema con l'utilizzo di un breve intervallo di sonno che viene trattato come zero?

+0

Puoi pubblicare il codice in cui stai chiamando Thread.Sleep()? –

+0

Non preoccuparti. Pubblica il codice di registrazione del timestamp. ;] – bzlm

+1

5 ms sembra che si trovi entro il margine di errore, specialmente se si utilizzano i timestamp. Provalo di nuovo usando StopWatch e facci sapere se stai ancora osservando questo comportamento. –

risposta

21

Il tuo problema è simile alla maggior parte delle macchine moderne, DateTime.UtcNow ha una risoluzione di circa 10-15 ms (anche se vedo che la documentazione dice che è a circa 10 ms da NT 3.5). Se si desidera un tempo di risoluzione maggiore, consultare la classe Stopwatch, in particolare Stopwatch.GetTimestamp().

Si noti inoltre che il cronometro utilizzerà i timer ad alta risoluzione solo se disponibili (lo standard Stopwatch.IsHighResolution indicherà in fase di esecuzione). In caso contrario, torna a DateTime.UtcNow.Ticks.

4

Molto probabilmente, il problema è semplicemente che il timer ha una risoluzione limitata. Se si aggiorna solo, ad esempio, ogni 10 ms, si vedrà lo stesso timestamp su alcune iterazioni, anche se sono passati 5 ms.

Quale timer stai utilizzando per generare i tuoi timestamp?

0

Che tipo di sistema stai eseguendo? Piccoli intervalli possono dipendere dal processore e dalla sua alta risoluzione. Ho eseguito un'app su un palmare una volta in cui la risoluzione del timer stesso era 16ms. Quindi potrebbe essere legato all'hardware. Prova ad aumentare il periodo di tempo per dire 30ms e vedere se funziona allora.

1

Se ricordo correttamente l'affinamento del tempo di NT, che è stato introdotto nel kernel NT ed era ancora attivo allo stesso modo di XP, funziona proprio intorno al marchio 5ms. Stavamo creando un'applicazione in tempo reale e ci siamo imbattuti in quel problema. Non sarai in grado di ottenere costantemente un tempo di sonno di 5ms. Quello che abbiamo scoperto è che a volte ottieni 10 - 16 ms, a volte nessun ms e occasionalmente ancora raramente 5 ms.

Stavo facendo questi test circa 5 anni fa, anche se le cose potrebbero essere cambiate da allora.