Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
    }
}
Exemplo n.º 3
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);
}
Exemplo n.º 4
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);
}