背景就是想写一个仿真机器人运动平台,为了实现机器人运动,打算通过定时器每隔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
switch前的代码也没反应,应该是进入不了OnTimer函数
#6
添加了啊=。=
#7
蛤?什么意思啊
#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()
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)
应改为
void CRobotsDlg::OnTimer( UINT nIDEvent)
switch (nIDEvent)
#10
特别又重新添加了一遍,ON_WM_TIMER()确定添加了(⊙﹏⊙)
UINT_PTR改了也没用,关键还是进入不了OnTimer
#11
“:关键还是进入不了OnTimer:”
WM_TIME 消息 优先度 很低,程序 是不是 有 很多消息 要处理 ?
WM_TIME 消息 优先度 很低,程序 是不是 有 很多消息 要处理 ?
#12
BEGIN_MESSAGE_MAP(CRobotsDlg, CDialog
Ex)
//{{AFX_MSG_MAP(CRobotsDlg)
...
ON_WM_TIMER()
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//{{AFX_MSG_MAP(CRobotsDlg)
...
ON_WM_TIMER()
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#13
代码一点问题都没有。
UINT_PTR 和UINT ,也不是重点。自动添加的函数,不用刻意去改动。除非先生成代码,后来又升级版本,否则不用理这个。
怀疑你的系统设置有问题。比如某些流氓软件劫持或屏蔽了定时器,再有一个就是你的消息太多,而定时器消息的级别不够,但一般不会的。
UINT_PTR 和UINT ,也不是重点。自动添加的函数,不用刻意去改动。除非先生成代码,后来又升级版本,否则不用理这个。
怀疑你的系统设置有问题。比如某些流氓软件劫持或屏蔽了定时器,再有一个就是你的消息太多,而定时器消息的级别不够,但一般不会的。
#14
检查SetTimer返回值看是否设置成功,如果不成功调用GetLastError.
#15
修改SetTimer(1,200,NULL);里面的id
#16
好像的确有好多消息=。=就是要不停的在picture control上画圆再擦去。。。有处理办法么。。
#17
改id没用啊亲w
#18
"就是要不停的在picture control上画圆再擦去"
怎么做到的 ?
怎么做到的 ?
#19
就是先画个圆,再获取背景色,用等大的圆覆盖。。
#20
“要不停的” 怎么做到的 ?
#21
直接放循环里。。
#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;
}
}
否则消息被 阻塞
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的消息循环.
那么你就需要修改这部分实现了. 使用线程来实现耗时操作, 不要用看似NB的消息循环.
#1
没有遇到过,程序没有问题,是不是其他影响的
#2
在switch之前加些代码看看,能进ontimer这个函数没,如果不能进可能ontimer函数添加不正确
#3
switch (
*nIDEvent)
#4
楼主确定添加ON_WM_TIMER()了么?
#5
switch前的代码也没反应,应该是进入不了OnTimer函数
#6
添加了啊=。=
#7
蛤?什么意思啊
#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()
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)
应改为
void CRobotsDlg::OnTimer( UINT nIDEvent)
switch (nIDEvent)
#10
特别又重新添加了一遍,ON_WM_TIMER()确定添加了(⊙﹏⊙)
UINT_PTR改了也没用,关键还是进入不了OnTimer
#11
“:关键还是进入不了OnTimer:”
WM_TIME 消息 优先度 很低,程序 是不是 有 很多消息 要处理 ?
WM_TIME 消息 优先度 很低,程序 是不是 有 很多消息 要处理 ?
#12
BEGIN_MESSAGE_MAP(CRobotsDlg, CDialog
Ex)
//{{AFX_MSG_MAP(CRobotsDlg)
...
ON_WM_TIMER()
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//{{AFX_MSG_MAP(CRobotsDlg)
...
ON_WM_TIMER()
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#13
代码一点问题都没有。
UINT_PTR 和UINT ,也不是重点。自动添加的函数,不用刻意去改动。除非先生成代码,后来又升级版本,否则不用理这个。
怀疑你的系统设置有问题。比如某些流氓软件劫持或屏蔽了定时器,再有一个就是你的消息太多,而定时器消息的级别不够,但一般不会的。
UINT_PTR 和UINT ,也不是重点。自动添加的函数,不用刻意去改动。除非先生成代码,后来又升级版本,否则不用理这个。
怀疑你的系统设置有问题。比如某些流氓软件劫持或屏蔽了定时器,再有一个就是你的消息太多,而定时器消息的级别不够,但一般不会的。
#14
检查SetTimer返回值看是否设置成功,如果不成功调用GetLastError.
#15
修改SetTimer(1,200,NULL);里面的id
#16
好像的确有好多消息=。=就是要不停的在picture control上画圆再擦去。。。有处理办法么。。
#17
改id没用啊亲w
#18
"就是要不停的在picture control上画圆再擦去"
怎么做到的 ?
怎么做到的 ?
#19
就是先画个圆,再获取背景色,用等大的圆覆盖。。
#20
“要不停的” 怎么做到的 ?
#21
直接放循环里。。
#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;
}
}
否则消息被 阻塞
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的消息循环.
那么你就需要修改这部分实现了. 使用线程来实现耗时操作, 不要用看似NB的消息循环.