关于SetTimer间隔小于OmTimer执行时间的问题
2017-07-10 17:54
330 查看
如果SetTimer的时间间隔为t,其响应事件OnTimer代码执行一遍的时间为T,且T>t。
这样,一次未执行完毕,下一次定时到,这时候程序会如何执行?
可能的情况:
1、丢弃还未执行的代码,开始新的执行;
2、不丢弃,Timer消息进入消息队列排队,等到原来的代码执行完毕后,马上开始新的执行;
3、重入,就是原来的还继续执行,同时又开始一个新的执行;
答案:第二个,或者,第一个丢弃。不过丢弃的情况是, 消息队列满了, 第二次的消息没进去。
void COnTimer1Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CString str = "";
str.Format(" %d",i);
for(int k = 0;k<100;k++)
{
TRACE(str);
}
i++;
CDialog::OnTimer(nIDEvent);
}
不是的,你可以这样想,每一个窗口有一个消息队列,收到的消息就存在这里
然后winmain中的那个getmessage循环从队列中取得消息,然后dispatchmessage(其实,
可以认为她就是以消息为参数,调用窗口过程。)然后在去取下一个消息。
所以,第二个wm——timer来了,也只能在队列里面呆着, 等它前面的所有消息
都被处理完毕才会被处理。
另外,wm——timer消息有一个特点,只要消息队列中还有wm——timer(同一个定时器),
那么这个wm——timer就会被丢弃。也就是说,消息队列中最多只有一个wm——timer
(同一个定时器)
DoModal和MessageBox的自身代码里面有消息循环(负责消息取出和处理),当一个MessageBox还存在的时候,CPU还在处理MessageBox内部的代码,当你有任何消息的时候到来,MessageBox内部的代码会负责将之处理掉。
你要是不明白我给你讲!这里只有一个线程,当然只有一个消息循环,只是当你弹出对话框的时候,对话框阻塞了主线程的消息循环,而接替过来了消息循环,因为它的内部也是一个无限的消息接收,派发机制。而你再弹出另一个对话框b的时候,对话框b又会接替过来消息循环,而把第一个对话框阻塞掉。这也是你为什么弹出第2个对话框后第一个对话框变得点击无效了的原因。
http://bbs.csdn.net/topics/110151804 http://bbs.csdn.net/topics/370257632
这样,一次未执行完毕,下一次定时到,这时候程序会如何执行?
可能的情况:
1、丢弃还未执行的代码,开始新的执行;
2、不丢弃,Timer消息进入消息队列排队,等到原来的代码执行完毕后,马上开始新的执行;
3、重入,就是原来的还继续执行,同时又开始一个新的执行;
答案:第二个,或者,第一个丢弃。不过丢弃的情况是, 消息队列满了, 第二次的消息没进去。
void COnTimer1Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CString str = "";
str.Format(" %d",i);
for(int k = 0;k<100;k++)
{
TRACE(str);
}
i++;
CDialog::OnTimer(nIDEvent);
}
不是的,你可以这样想,每一个窗口有一个消息队列,收到的消息就存在这里
然后winmain中的那个getmessage循环从队列中取得消息,然后dispatchmessage(其实,
可以认为她就是以消息为参数,调用窗口过程。)然后在去取下一个消息。
所以,第二个wm——timer来了,也只能在队列里面呆着, 等它前面的所有消息
都被处理完毕才会被处理。
另外,wm——timer消息有一个特点,只要消息队列中还有wm——timer(同一个定时器),
那么这个wm——timer就会被丢弃。也就是说,消息队列中最多只有一个wm——timer
(同一个定时器)
DoModal和MessageBox的自身代码里面有消息循环(负责消息取出和处理),当一个MessageBox还存在的时候,CPU还在处理MessageBox内部的代码,当你有任何消息的时候到来,MessageBox内部的代码会负责将之处理掉。
你要是不明白我给你讲!这里只有一个线程,当然只有一个消息循环,只是当你弹出对话框的时候,对话框阻塞了主线程的消息循环,而接替过来了消息循环,因为它的内部也是一个无限的消息接收,派发机制。而你再弹出另一个对话框b的时候,对话框b又会接替过来消息循环,而把第一个对话框阻塞掉。这也是你为什么弹出第2个对话框后第一个对话框变得点击无效了的原因。
http://bbs.csdn.net/topics/110151804 http://bbs.csdn.net/topics/370257632
相关文章推荐
- 关于ASIHTTPRequest连续请求,并发连续,间隔时间很小崩溃问题
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- RXSwift 关于使用textFiled的时候onCompleted 什么时间执行的问题
- 关于perl脚本执行时间的问题
- settimer 设置的时间间隔不精确问题,mfc使用多线程播放视频
- Android开发关于onActivityResult()的执行时间问题
- quartz做集群配置较短的时间间隔会重复执行任务的问题
- python 中关于时间间隔问题
- 关于Web项目里的给表单验证控件添加结束时间不得小于开始时间的验证方法,日期转换和前台显示格式之间,还有JSON取日期数据格式转换成标准日期格式的问题
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- spark SQL读取ORC文件从Driver启动到开始执行Task(或stage)间隔时间太长(计算Partition时间太长)且产出orc单个文件中stripe个数太多问题解决方案
- 【selenium】python+selenium+unittest,关于每次执行完一个测试用例都关闭浏览器等时间较长的问题之解决方案
- 关于类似朋友圈的发布时间间隔计算问题(python)
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- 关于python使用pyrex编译成可执行文件的问题
- 关于在链接中执行JS要注意的问题
- 关于DateTime在远程服务器使用以及日期与时间格式的问题
- 关于系统时间被改问题的解决办法
- 关于xp+ie7下,执行confirm会出现点击取消也执行submit的问题解决方案
- 关于Xerces-C++执行schema校验相关问题的详细解答