首页 > 解决方案 > 定时器超时复位

问题描述

我使用计时器来绘制动画,但我希望动画的速度在用户输入时改变。

API 的文档中,我读到:

要与计时器关联的窗口句柄。此窗口必须由调用线程拥有。如果 hWnd 的 NULL 值与现有计时器的 nIDEvent 一起传入,则该计时器将以与现有非 NULL hWnd 计时器相同的方式被替换。

我知道我应该在SetTimer()没有hWnd参数的情况下调用函数来重置计时器,所以我这样做了:

//函数声明

void InitiateTimer(HWND hWnd)
{
    SetTimer(hWnd,                          // handle to main window 
        IDT_TIMER,                          // timer identifier 
        1000 / Robot_Settings::getSpeed(),  // 1-second interval / speed 
        (TIMERPROC)NULL);                   // no timer callback 

    timerInitiated = true;
}

void ResetTimer()
{
    SetTimer(NULL,
        IDT_TIMER, 
        1000 / Robot_Settings::getSpeed(), 
        (TIMERPROC)NULL);
}

//WindowProc中的函数调用

    case BUTTON_START:
        stopClicked = false;
        DestroyWindow(hStartButton);
        CreateStopButton(hWnd);
        if (!timerInitiated)
        {
            InitiateTimer(hWnd);
        }
        else if (timerInitiated)
        {
            ResetTimer();
        }
        return 0;

这个想法是,在重置时,超时将根据Robot_Settings::getSpeed(). 不幸的是,这不会发生。

我错过了什么?

标签: c++winapitimer

解决方案


我认为您误解了文档。

要更改现有计时器,您必须传递与最初调用时相同的hWnd,nIDEvent和参数组合。lpTimerFuncSetTimer

参考

如果 hWnd 参数不为 NULL 并且由 hWnd 指定的窗口已经有一个值为 nIDEvent 的计时器,那么现有的计时器将被新的计时器替换。

还:

计时器标识符 nIDEvent 特定于相关联的窗口。另一个窗口可以有自己的计时器,该计时器与另一个窗口拥有的计时器具有相同的标识符。计时器是不同的。

仅最后一个引用就足以证明您始终必须指定hWnd参数来修改与窗口关联的现有计时器。否则,系统怎么知道,你想改变哪个定时器?您可以有两个窗口,每个窗口的计时器 ID 为 1,它们是两个不同的计时器!


推荐阅读