Windows 如何累积 WM_TIMER 消息?
How does Windows accumulate WM_TIMER messages?
据我了解,调用 InvalidateRect
等函数时不会生成 WM_PAINT
消息;而是一个可以被认为是包含一些关于 脏 区域信息的标志的对象被设置,并且当队列中的其他消息被处理时,单个 WM_PAINT
生成的消息结合了自上次成功 WM_PAINT
消息以来所有标志的区域。大概这是每个与特定线程关联的 HWND 完成一次
我想知道 WM_TIMER
消息是如何累积的?我认为也许只保留每个线程的最新标志,但如果不同的 TIMERPROC 和 window 句柄具有不同的计时器怎么办。如果两个 SetTimer
具有不同间隔的调用指向同一个 window 句柄怎么办?每个定时器ID会生成一个WM_TIMER
吗?
What if two SetTimer calls with different intervals point to the same window handle; will one WM_TIMER be generated for each timer ID?
是的,每个不同的计时器都会生成一条消息。
您明确声明 "with different intervals"。但这不是一个因素。重要的是定时器标识,由定时器 ID 定义。您可以有多个具有相同间隔的不同计时器。
可能发生的情况是,如果消息队列没有像事件逻辑生成那样频繁地得到服务,则计时器事件可能会合并。因此,如果在调用消息泵之间经过了多个计时器间隔,则只会生成一个计时器消息。不要将计时器事件视为指示计时器已经过去了多少,而是将它们视为指示至少指定的时间间隔已经过去。
据我了解,调用 InvalidateRect
等函数时不会生成 WM_PAINT
消息;而是一个可以被认为是包含一些关于 脏 区域信息的标志的对象被设置,并且当队列中的其他消息被处理时,单个 WM_PAINT
生成的消息结合了自上次成功 WM_PAINT
消息以来所有标志的区域。大概这是每个与特定线程关联的 HWND 完成一次
我想知道 WM_TIMER
消息是如何累积的?我认为也许只保留每个线程的最新标志,但如果不同的 TIMERPROC 和 window 句柄具有不同的计时器怎么办。如果两个 SetTimer
具有不同间隔的调用指向同一个 window 句柄怎么办?每个定时器ID会生成一个WM_TIMER
吗?
What if two SetTimer calls with different intervals point to the same window handle; will one WM_TIMER be generated for each timer ID?
是的,每个不同的计时器都会生成一条消息。
您明确声明 "with different intervals"。但这不是一个因素。重要的是定时器标识,由定时器 ID 定义。您可以有多个具有相同间隔的不同计时器。
可能发生的情况是,如果消息队列没有像事件逻辑生成那样频繁地得到服务,则计时器事件可能会合并。因此,如果在调用消息泵之间经过了多个计时器间隔,则只会生成一个计时器消息。不要将计时器事件视为指示计时器已经过去了多少,而是将它们视为指示至少指定的时间间隔已经过去。