前天维护一个项目代码,在一个View里面加了一个计时器。
SetTimer(2,50,NULL);
奇怪的是,在OnTimer方法里没有捕捉到设置的计时器。
CXXXView::OnTimer(UINT nIdEvent)
{
.......
if(nIDEvent == 2)
{
//执行不到这里
......
}
}
这么一个简单的问题都解决不了,实在是让我困惑无比。查看MSDN里面CWnd::SetTimer的说明,提到返回值为0时表面设置计时器不成功。
于是我修改代码:
if(SeTimer(2,50,NULL) == 0)
{
OutputDebugString("计时器设置失败");
}
奇怪的是实际运行时并没有返回非零值。
再一次检查代码,我终于发现了问题所在,我不小心把SetTimer放到了这个View类的构造函数里。此时窗口还没有创建,m_hWnd为空值,SetTimer肯定不成功。
但是诡异的是这种情况下SetTimer的返回值既不是0,也不是预先设定的事件号,而是一个随机的很大的数值。不过如果是编译为Debug模式下,程序会出现断言错误,这是CWnd::SetTimer里面的断言在起作用。不过因为我都是在生产环境中测试,使用的是Release模式,所以没有能够立即发现这个问题。