首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetTimer(NULL,NULL,UINT,NULL)

SetTimer(NULL,NULL,UINT,NULL)
EN

Stack Overflow用户
提问于 2021-08-25 13:48:36
回答 1查看 261关注 0票数 0

我正在审查具有以下代码行的MFC应用程序:

代码语言:javascript
复制
SetTimer(NULL, NULL, 50, NULL);

来自WinAPI文档:

代码语言:javascript
复制
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时会发生什么。

问题:

  1. hWnd == NULL在SetTimer中做什么?

  1. nIDEvent == NULL总是暗示我要创建一个新的计时器(其ID将由调用返回),而不是“替换”现有的计时器?

  1. 我们应该从SetTimer获取返回值,并在退出这个线程时有一个对应的KillTimer(return_value)吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-25 16:04:50

hWnd == NULL在SetTimer中做什么?

hWndNULL时,计时器不与窗口相关联。将其视为线程或应用程序中的全局独立计时器。

nIDEvent == NULL总是暗示我希望创建一个新的计时器(其ID将由调用返回),而不是“替换”现有的计时器?

是。请参阅这一行:

如果调用不打算替换现有计时器,则如果

为NULL,则nIDEvent应为0。

我们应该从SetTimer获取返回值,并在退出这个线程时有一个对应的KillTimer(return_value)吗?

是。请参阅本部分:

如果函数成功且

参数为NULL,则返回值是标识新计时器的整数。应用程序可以将此值传递给KillTimer函数以销毁定时器。

正确的代码是:

代码语言:javascript
复制
UINT_PTR timerId = SetTimer(NULL, 0, 50, NULL);

// some code

KillTimer(NULL, timerId);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68924157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档