void setSharedTimerFireDelay(double interval) { ASSERT(sharedTimerFiredFunction); unsigned intervalInMS; if (interval < 0) intervalInMS = 0; else { interval *= 1000; if (interval > USER_TIMER_MAXIMUM) intervalInMS = USER_TIMER_MAXIMUM; else intervalInMS = (unsigned)interval; } if (timerID) { KillTimer(0, timerID); timerID = 0; } // We don't allow nested PostMessages, since the custom messages will effectively starve // painting and user input. (Win32 has a tri-level queue with application messages > // user input > WM_PAINT/WM_TIMER.) // In addition, if the queue contains input events that have been there since the last call to // GetQueueStatus, PeekMessage or GetMessage we favor timers. if (intervalInMS < USER_TIMER_MINIMUM && processingCustomTimerMessage && !LOWORD(::GetQueueStatus(QS_ALLINPUT))) { // Windows SetTimer does not allow timeouts smaller than 10ms (USER_TIMER_MINIMUM) initializeOffScreenTimerWindow(); PostMessage(timerWindowHandle, timerFiredMessage, 0, 0); } else timerID = SetTimer(0, 0, intervalInMS, timerFired); }
void setSharedTimerFireInterval(double interval) { ASSERT(sharedTimerFiredFunction); unsigned intervalInMS; interval *= 1000; if (interval > USER_TIMER_MAXIMUM) intervalInMS = USER_TIMER_MAXIMUM; else intervalInMS = static_cast<unsigned>(interval); initializeOffScreenTimerWindow(); bool timerSet = false; #if !OS(WINCE) if (Settings::shouldUseHighResolutionTimers()) { if (interval < highResolutionThresholdMsec) { if (!highResTimerActive) { highResTimerActive = true; timeBeginPeriod(timerResolution); } SetTimer(timerWindowHandle, endHighResTimerID, stopHighResTimerInMsec, 0); } DWORD queueStatus = LOWORD(GetQueueStatus(QS_PAINT | QS_MOUSEBUTTON | QS_KEY | QS_RAWINPUT)); // Win32 has a tri-level queue with application messages > user input > WM_PAINT/WM_TIMER. // If the queue doesn't contains input events, we use a higher priorty timer event posting mechanism. if (!(queueStatus & (QS_MOUSEBUTTON | QS_KEY | QS_RAWINPUT))) { if (intervalInMS < USER_TIMER_MINIMUM && !processingCustomTimerMessage && !(queueStatus & QS_PAINT)) { // Call PostMessage immediately if the timer is already expired, unless a paint is pending. // (we prioritize paints over timers) if (InterlockedIncrement(&pendingTimers) == 1) PostMessage(timerWindowHandle, timerFiredMessage, 0, 0); timerSet = true; } else { // Otherwise, delay the PostMessage via a CreateTimerQueueTimer if (!timerQueue) timerQueue = CreateTimerQueue(); if (timer) DeleteTimerQueueTimer(timerQueue, timer, 0); timerSet = CreateTimerQueueTimer(&timer, timerQueue, queueTimerProc, 0, intervalInMS, 0, WT_EXECUTEINTIMERTHREAD | WT_EXECUTEONLYONCE); } } } #endif // !OS(WINCE) if (timerSet) { if (timerID) { KillTimer(timerWindowHandle, timerID); timerID = 0; } } else { timerID = SetTimer(timerWindowHandle, sharedTimerID, intervalInMS, 0); timer = 0; } }
void setSharedTimerFireTime(double fireTime) { ASSERT(sharedTimerFiredFunction); double interval = (fireTime - currentTime()) * 1000.; unsigned intervalInMS = interval < USER_TIMER_MINIMUM ? USER_TIMER_MINIMUM : interval > USER_TIMER_MAXIMUM ? USER_TIMER_MAXIMUM : static_cast<unsigned>(interval); if (timerID == TimerIdAuto) { KillTimer(timerWindowHandle, TimerIdAuto); timerID = TimerIdNone; } initializeOffScreenTimerWindow(); if (SetTimer(timerWindowHandle, TimerIdAuto, intervalInMS, 0)) timerID = TimerIdAuto; else if (timerID != TimerIdManual) PostMessage(timerWindowHandle, WM_USER, 0, 0); }
void setSharedTimerFireInterval(double intervalSeconds) { ASSERT(sharedTimerFiredFunction); double intervalMS = intervalSeconds * 1000.; unsigned clampedIntervalMS = intervalMS < USER_TIMER_MINIMUM ? USER_TIMER_MINIMUM : intervalMS > USER_TIMER_MAXIMUM ? USER_TIMER_MAXIMUM : static_cast<unsigned>(intervalMS); if (timerID == TimerIdAuto) { KillTimer(timerWindowHandle, TimerIdAuto); timerID = TimerIdNone; } initializeOffScreenTimerWindow(); if (SetTimer(timerWindowHandle, TimerIdAuto, clampedIntervalMS, 0)) timerID = TimerIdAuto; else if (timerID != TimerIdManual) PostMessage(timerWindowHandle, WM_USER, 0, 0); }