【问题标题】:WinApi WndProc's Timer procedure issueWinApi WndProc 的 Timer 程序问题
【发布时间】:2017-01-28 19:28:15
【问题描述】:

我有一个关于 WndProc 的 Timer 过程功能的问题。 如果在定时器调用该函数后 Display_function 还没有完成,如果下一个 TM_TIMER 函数及时调用,但它仍在运行 Display_function,会发生什么?

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HANDLE hTimer;
switch (iMessage)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case 0:

hTimer = (HANDLE)SetTimer(hWnd, 1, 10, NULL); //10ms
SendMessage(hWnd, WM_TIMER, 1, 0); 
break;

....
case WM_TIMER:
switch (wParam)
{
case 1:
Display_function(hWnd); 
break;
}

【问题讨论】:

  • 每个人似乎都以错误的方式使用SetTimernIDEvent 参数是指针大小是有原因的。设置具有唯一 ID 的指针的安全方法是传递(本地)变量的地址。这样 ID 就不会与另一个计时器 ID 发生冲突。

标签: winapi


【解决方案1】:

当您从消息队列中检索消息时,会合成计时器消息。他们不能中断线程的任务。

计时器消息通常由您从主消息循环调用GetMessage 合成。

【讨论】:

  • 谢谢,但我没有完全理解,这意味着 Display_function 在完成之前不能被计时器中断。我说的对吗?
  • @grander2 - 是的,当然 Display_function 不会被中断
  • 正确。调用 GetMessage 的是您的代码。只要你不在 Display_function 中发送消息,就不会再进入。
猜你喜欢
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
相关资源
最近更新 更多