Podczas oczekiwania na niesygnalizowane zdarzenie przy użyciu funkcji WaitForSingleObject, stwierdzam, że w niektórych przypadkach wywołanie zwróci wartość CZAS_STRONY_OSTRONTU w czasie krótszym niż określony limit czasu. Po prostu zapętlając połączenie z limitem czasu ustawionym na 1000ms, widziałem powrót połączenia w okresach tak niskich jak 990ms (uruchomionych na WinXP). Używam QueryPerformanceCounter, aby uzyskać niezależny od zegara systemowego pomiar czasu, więc nie sądzę, że dryf zegara prawdopodobnie będzie odpowiedzią.Limit czasu oczekiwania WaitForSingleObject
To zachowanie nie stanowi dla mnie żadnych praktycznych problemów, ale chciałbym go lepiej zrozumieć. Wygląda na to, że może działać z mniej więcej rozdzielczością znacznika czasu. Czy firma Microsoft publikuje dalsze szczegóły dotyczące dokładności tej funkcji? Czy powinienem oczekiwać większej precyzji w Vista?
Chciałbym zasugerować mały test: po prostu wstaw "sleep (0)" przed funkcją wait. Jest bardzo prawdopodobne, że zmieni to zachowanie, aby spełnić Twoje oczekiwania. Również: Konwersja wyników 'QueryPerformanceCounter()' na wartości czasu przy użyciu częstotliwości zwracanej przez 'QueryPerformanceFrequency()' oznacza, że częstotliwość jest precyzyjna. Podana częstotliwość jest traktowana jako stała. Ale nietrafiony sprzęt ma tolerancje. Częstotliwość zawsze ma przesunięcie, a nawet dryf termiczny. – Arno