我正在审查具有以下代码行的MFC应用程序:
SetTimer(NULL, NULL, 50, NULL);来自WinAPI文档:
UINT_PTR SetTimer(
HWND hWnd,
UINT_PTR nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc
);参数
hWnd
类型: HWND
与定时器相关联的窗口句柄。此窗口必须由调用线程拥有。如果hWnd的NULL值与现有计时器的nIDEvent一起传入,则该定时器将以与现有的非空hWnd计时器相同的方式替换。
nIDEvent
类型: UINT_PTR
非零计时器标识符。如果hWnd参数为NULL,且nIDEvent与现有计时器不匹配,则忽略它并生成新的计时器ID。如果hWnd参数不是NULL,而hWnd指定的窗口已经有一个具有nIDEvent值的计时器,那么现有的计时器将被新的计时器替换。当SetTimer替换计时器时,计时器将被重置。因此,在当前超时值过去后,将发送消息,但忽略以前设置的超时值。如果调用不打算替换现有计时器,则如果nIDEvent为空,则hWnd应为0。
我相信这一行代码的目的是创建一个50 is定时器(而不是替换一些现有的计时器),但我不理解hWnd参数为NULL的效果。
文档没有向我说明当我用hWnd参数NULL和nIDEvent参数NULL调用hWnd时会发生什么。
问题:
。
KillTimer(return_value)吗?发布于 2021-08-25 16:04:50
hWnd == NULL在SetTimer中做什么?
当hWnd是NULL时,计时器不与窗口相关联。将其视为线程或应用程序中的全局独立计时器。
nIDEvent == NULL总是暗示我希望创建一个新的计时器(其ID将由调用返回),而不是“替换”现有的计时器?。
是。请参阅这一行:
如果调用不打算替换现有计时器,则如果
为NULL,则nIDEvent应为0。
我们应该从SetTimer获取返回值,并在退出这个线程时有一个对应的KillTimer(return_value)吗?
是。请参阅本部分:
如果函数成功且
参数为NULL,则返回值是标识新计时器的整数。应用程序可以将此值传递给KillTimer函数以销毁定时器。
正确的代码是:
UINT_PTR timerId = SetTimer(NULL, 0, 50, NULL);
// some code
KillTimer(NULL, timerId);https://stackoverflow.com/questions/68924157
复制相似问题