MFC中SetTimer后始终无法进入OnTimer函数

时间:2021-01-22 00:21:47
RT。
背景就是想写一个仿真机器人运动平台,为了实现机器人运动,打算通过定时器每隔200ms左右让机器人运动一段距离。

//开始运动
void CRobotsDlg::OnBnClickedStart()
{
// TODO: 在此添加控件通知处理程序代码
SetTimer(1,200,NULL);
//MessageBox(TEXT("111"));
}


void CRobotsDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nIDEvent)
{
case 1:
MoveRobots();
break;
}

CDialogEx::OnTimer(nIDEvent);
}

然后消息响应也添加了。debug的时候,断点设置在SetTimer和MessageBox那边都没问题,但设置在switch这里就到不了了。

26 个解决方案

#1


没有遇到过,程序没有问题,是不是其他影响的

#2


在switch之前加些代码看看,能进ontimer这个函数没,如果不能进可能ontimer函数添加不正确

#3


 switch ( *nIDEvent)

#4


楼主确定添加ON_WM_TIMER()了么?

#5


引用 2 楼 lang14 的回复:
在switch之前加些代码看看,能进ontimer这个函数没,如果不能进可能ontimer函数添加不正确


switch前的代码也没反应,应该是进入不了OnTimer函数

#6


引用 4 楼 whx19881209 的回复:
楼主确定添加ON_WM_TIMER()了么?


添加了啊=。=

#7


引用 3 楼 zhao4zhong1 的回复:
 switch ( *nIDEvent)


蛤?什么意思啊

#8


UINT_PTR nIDEvent
nIDEvent的类型既然是指向UINT的指针,那么*nIDEvent是取nIDEvent所指的UINT值。

提醒:消息映射加了吗?

BEGIN_MESSAGE_MAP(CRobotsDlg, CDialog)
    //{{AFX_MSG_MAP(CRobotsDlg)
...
   ON_WM_TIMER()
...
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

#9


void CRobotsDlg::OnTimer( UINT_PTR nIDEvent)
应改为
void CRobotsDlg::OnTimer( UINT nIDEvent)
switch (nIDEvent)

#10


引用 9 楼 zhao4zhong1 的回复:
void CRobotsDlg::OnTimer( UINT_PTR nIDEvent)
应改为
void CRobotsDlg::OnTimer( UINT nIDEvent)
switch (nIDEvent)


特别又重新添加了一遍,ON_WM_TIMER()确定添加了(⊙﹏⊙)
UINT_PTR改了也没用,关键还是进入不了OnTimer

#11


“:关键还是进入不了OnTimer:”
WM_TIME 消息 优先度 很低,程序 是不是 有 很多消息 要处理 ?

#12


BEGIN_MESSAGE_MAP(CRobotsDlg, CDialog Ex)
    //{{AFX_MSG_MAP(CRobotsDlg)
...
   ON_WM_TIMER()
...
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

#13


代码一点问题都没有。
UINT_PTR 和UINT ,也不是重点。自动添加的函数,不用刻意去改动。除非先生成代码,后来又升级版本,否则不用理这个。

怀疑你的系统设置有问题。比如某些流氓软件劫持或屏蔽了定时器,再有一个就是你的消息太多,而定时器消息的级别不够,但一般不会的。

#14


检查SetTimer返回值看是否设置成功,如果不成功调用GetLastError.

#15


修改SetTimer(1,200,NULL);里面的id

#16


引用 11 楼 schlafenhamster 的回复:
“:关键还是进入不了OnTimer:”
WM_TIME 消息 优先度 很低,程序 是不是 有 很多消息 要处理 ?


好像的确有好多消息=。=就是要不停的在picture control上画圆再擦去。。。有处理办法么。。

#17


引用 15 楼 yzwyq 的回复:
修改SetTimer(1,200,NULL);里面的id


改id没用啊亲w

#18


"就是要不停的在picture control上画圆再擦去"
怎么做到的 ?

#19


引用 18 楼 schlafenhamster 的回复:
"就是要不停的在picture control上画圆再擦去"
怎么做到的 ?


就是先画个圆,再获取背景色,用等大的圆覆盖。。

#20


“要不停的” 怎么做到的 ?

#21


引用 20 楼 schlafenhamster 的回复:
“要不停的” 怎么做到的 ?


直接放循环里。。

#22


在 循环里 加一句

void DoEvents()
{
MSG msg;
// Process existing messages in the application's message queue.
// When the queue is empty, do clean up and return.
while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{// has msg
if (!AfxGetThread()->PumpMessage()) break;
}
}
否则消息被 阻塞

#23


设置时间长一点,而且1这个不太好,下断点调试一下

#24


vs 有时候故障,可以重启试试

#25


楼主解决了吗?我也遇到了这个问题,求教

#26


应该就是你的这个东西导致的timer消息不响应. 你去掉这部分代码再看看吧.  如果去掉后可以.
那么你就需要修改这部分实现了.  使用线程来实现耗时操作, 不要用看似NB的消息循环.

引用 16 楼 u012083651 的回复:
好像的确有好多消息=。=就是要不停的在picture control上画圆再擦去。。。有处理办法么。。


#1


没有遇到过,程序没有问题,是不是其他影响的

#2


在switch之前加些代码看看,能进ontimer这个函数没,如果不能进可能ontimer函数添加不正确

#3


 switch ( *nIDEvent)

#4


楼主确定添加ON_WM_TIMER()了么?

#5


引用 2 楼 lang14 的回复:
在switch之前加些代码看看,能进ontimer这个函数没,如果不能进可能ontimer函数添加不正确


switch前的代码也没反应,应该是进入不了OnTimer函数

#6


引用 4 楼 whx19881209 的回复:
楼主确定添加ON_WM_TIMER()了么?


添加了啊=。=

#7


引用 3 楼 zhao4zhong1 的回复:
 switch ( *nIDEvent)


蛤?什么意思啊

#8


UINT_PTR nIDEvent
nIDEvent的类型既然是指向UINT的指针,那么*nIDEvent是取nIDEvent所指的UINT值。

提醒:消息映射加了吗?

BEGIN_MESSAGE_MAP(CRobotsDlg, CDialog)
    //{{AFX_MSG_MAP(CRobotsDlg)
...
   ON_WM_TIMER()
...
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

#9


void CRobotsDlg::OnTimer( UINT_PTR nIDEvent)
应改为
void CRobotsDlg::OnTimer( UINT nIDEvent)
switch (nIDEvent)

#10


引用 9 楼 zhao4zhong1 的回复:
void CRobotsDlg::OnTimer( UINT_PTR nIDEvent)
应改为
void CRobotsDlg::OnTimer( UINT nIDEvent)
switch (nIDEvent)


特别又重新添加了一遍,ON_WM_TIMER()确定添加了(⊙﹏⊙)
UINT_PTR改了也没用,关键还是进入不了OnTimer

#11


“:关键还是进入不了OnTimer:”
WM_TIME 消息 优先度 很低,程序 是不是 有 很多消息 要处理 ?

#12


BEGIN_MESSAGE_MAP(CRobotsDlg, CDialog Ex)
    //{{AFX_MSG_MAP(CRobotsDlg)
...
   ON_WM_TIMER()
...
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

#13


代码一点问题都没有。
UINT_PTR 和UINT ,也不是重点。自动添加的函数,不用刻意去改动。除非先生成代码,后来又升级版本,否则不用理这个。

怀疑你的系统设置有问题。比如某些流氓软件劫持或屏蔽了定时器,再有一个就是你的消息太多,而定时器消息的级别不够,但一般不会的。

#14


检查SetTimer返回值看是否设置成功,如果不成功调用GetLastError.

#15


修改SetTimer(1,200,NULL);里面的id

#16


引用 11 楼 schlafenhamster 的回复:
“:关键还是进入不了OnTimer:”
WM_TIME 消息 优先度 很低,程序 是不是 有 很多消息 要处理 ?


好像的确有好多消息=。=就是要不停的在picture control上画圆再擦去。。。有处理办法么。。

#17


引用 15 楼 yzwyq 的回复:
修改SetTimer(1,200,NULL);里面的id


改id没用啊亲w

#18


"就是要不停的在picture control上画圆再擦去"
怎么做到的 ?

#19


引用 18 楼 schlafenhamster 的回复:
"就是要不停的在picture control上画圆再擦去"
怎么做到的 ?


就是先画个圆,再获取背景色,用等大的圆覆盖。。

#20


“要不停的” 怎么做到的 ?

#21


引用 20 楼 schlafenhamster 的回复:
“要不停的” 怎么做到的 ?


直接放循环里。。

#22


在 循环里 加一句

void DoEvents()
{
MSG msg;
// Process existing messages in the application's message queue.
// When the queue is empty, do clean up and return.
while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{// has msg
if (!AfxGetThread()->PumpMessage()) break;
}
}
否则消息被 阻塞

#23


设置时间长一点,而且1这个不太好,下断点调试一下

#24


vs 有时候故障,可以重启试试

#25


楼主解决了吗?我也遇到了这个问题,求教

#26


应该就是你的这个东西导致的timer消息不响应. 你去掉这部分代码再看看吧.  如果去掉后可以.
那么你就需要修改这部分实现了.  使用线程来实现耗时操作, 不要用看似NB的消息循环.

引用 16 楼 u012083651 的回复:
好像的确有好多消息=。=就是要不停的在picture control上画圆再擦去。。。有处理办法么。。