2009-05-21 21 views
11

Quando si attende un evento non segnalato utilizzando la funzione WaitForSingleObject, in alcuni casi la chiamata restituirà WAIT_TIMEOUT in meno del periodo di timeout specificato. Semplicemente collegando la chiamata con un timeout impostato su 1000ms, ho visto il ritorno della chiamata in periodi a partire da 990ms (in esecuzione su WinXP). Sto usando QueryPerformanceCounter per ottenere una misurazione del tempo indipendente dall'orologio di sistema, quindi non penso che la deriva del clock sia probabilmente una risposta.Timeout risoluzione di WaitForSingleObject

Questo comportamento non presenta problemi pratici per me, ma mi piacerebbe capirlo meglio. Sembra che funzioni all'incirca alla risoluzione di un tick del timer. Microsoft pubblica ulteriori dettagli sulla precisione di questa funzione? Dovrei aspettarmi maggiore precisione in Vista?

+0

Vorrei suggerire un piccolo test: basta mettere un 'sleep (0)' prima della funzione wait. Questo è molto probabile che cambi il comportamento per soddisfare le tue aspettative. Inoltre: la conversione dei risultati di 'QueryPerformanceCounter()' in valori temporali utilizzando la sua frequenza restituita da 'QueryPerformanceFrequency()' implica che la frequenza sia precisa. La frequenza data viene trattata come una costante. Ma l'hardware non finalizzato ha tolleranze. La frequenza ha sempre un offset e forse anche deriva termica. – Arno

risposta

8

Sì, WaitForSingleObject utilizza la risoluzione tick del timer, non utilizza un timer ad alta risoluzione come QueryPerformanceCounter.

http://msdn.microsoft.com/en-us/library/ms687069(VS.85).aspx, l'articolo MSDN "Wait Funzioni" espande su questo:

La precisione del time-out intervallo specificato dipende dalla risoluzione del clock di sistema. L'orologio di sistema "spunta" a una velocità costante. Se l'intervallo di timeout è inferiore alla risoluzione dell'orologio di sistema, l'attesa potrebbe scadere in un intervallo di tempo specificato inferiore a . Se l'intervallo di timeout è maggiore di uno tick ma inferiore a due, l'attesa può essere tra uno e due tick, e così via.

Questo articolo spiega anche come utilizzare timeBeginPeriod per aumentare la risoluzione di clock del sistema, ma questo non è raccomandato.

Posso pensare a diversi motivi per cui. Innanzitutto, non è necessaria una risoluzione più elevata per quasi tutti i casi di utilizzo di WaitForSingleObject. L'uso di un timer ad alta risoluzione richiederebbe al kernel il polling continuo del timer (non fattibile dato che il codice del kernel non è sempre garantito) o lo riprogramma frequentemente per generare un interrupt (poiché potrebbero esserci più oggetti WaitForSingleObjects e molto probabilmente solo un singolo interruzione programmabile).

D'altra parte, esiste già una sorgente di temporizzazione che è costantemente aggiornabile a una risoluzione che è più che sufficiente per WaitForSingleObject, SetWaitableTimer e Sleep.