游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2803|回复: 6

计时器暴走已解决

[复制链接]

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
发表于 2007-1-8 15:25:00 | 显示全部楼层 |阅读模式

  1.         BOOL bActive = TRUE;
  2.         MSG msg;
  3.         ZeroMemory(&msg, sizeof(msg));

  4.                while(msg.message != WM_QUIT)
  5.         {
  6.                             if(m_bActive)
  7.                    bActive = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
  8.                     else          
  9.                            bActive = GetMessage(&msg, NULL, 0, 0);
  10.                     if(m_bActive)
  11.                    {
  12.                  TranslateMessage(&msg);
  13.                   DispatchMessage(&msg);
  14.                    }
  15. }
复制代码


我要像上面那么写就会导致WM_TIMER很疯狂。


  1.         BOOL bActive = TRUE;
  2.         MSG msg;
  3.         ZeroMemory(&msg, sizeof(msg));

  4.                while(msg.message != WM_QUIT)
  5.         {
  6.                             if(m_bActive)
  7.                    bActive = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
  8.                     else          
  9.                            bActive = GetMessage(&msg, NULL, 0, 0);
  10.                     if(bActive)
  11.                    {
  12.                  TranslateMessage(&msg);
  13.                   DispatchMessage(&msg);
  14.                    }
  15. }
复制代码


要这么写就正常了。
高人指点下为什么? 我猜是PeekMessage导致的吧?

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2007-1-8 18:16:00 | 显示全部楼层

Re:计时器暴走已解决

这是大家来找叉吗
为什么我没有看出差别在哪

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
 楼主| 发表于 2007-1-8 19:23:00 | 显示全部楼层

Re:计时器暴走已解决

饿, 斑竹,   是  bActive  和 m_bActive  ,
我的  m_bActive 从 WM_ACTIVATEAPP 消息中 获取 wParam 的值来确定
窗口是否激活。

如果  直接 m_bActive  就会暴走, 而用

if(m_bActive)
    bActive = PeekMessage()
else
     bActive = GetMessage()

的方式,就不会暴走。

4

主题

88

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2007-1-9 12:05:00 | 显示全部楼层

Re:计时器暴走已解决

同意2楼,真没看出来你写的两个有什么区别

3

主题

155

帖子

161

积分

注册会员

Rank: 2

积分
161
发表于 2007-1-9 13:02:00 | 显示全部楼层

Re:计时器暴走已解决

理论上是有消息就: 翻译,发布消息.
你的第二个写法.就是这个意思,所以是消息能及时处理.

第一个写法意思是:窗口活动(m_bActive)就  翻译,发布消息.
算法是错的.
如果窗口不活动,就会有很多消息积累在消息队列.
WN_TIMER就不会放在队列里了.(让一步,就算WN_TIMER能放在队列里,也已经变味了)


125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
 楼主| 发表于 2007-1-10 00:20:00 | 显示全部楼层

Re:计时器暴走已解决

意思是 活动就 发布消息,会把消息队列填满,而 WM_TIMER进不了消息队列
吗? 而导致 WM_TIMER 异常响应吗?

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2007-1-10 22:00:00 | 显示全部楼层

Re:计时器暴走已解决

暴走族啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 05:41

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表