关于SetTimer间隔小于OmTimer执行时间的问题

如果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

时间: 2024-10-10 10:51:31

关于SetTimer间隔小于OmTimer执行时间的问题的相关文章

修复FFMPEG 复用 PAT、PMT发送间隔小于25ms的错误

分析ffmpeg源码 分析问题 mpegtsenc.c 找到发送PAT.PMT的函数 /* send SDT, PAT and PMT tables regularly */ static void retransmit_si_info(AVFormatContext *s, int force_pat, int64_t dts) { MpegTSWrite *ts = s->priv_data; int i; if (++ts->sdt_packet_count == ts->sdt_

【ML-9-1】支持向量机--软硬间隔与支持向量机

我们知道较早的分类模型--感知机(1957年)是二类分类的线性分类模型,也是后来神经网络和支持向量机的基础.支持向量机(Support vector machines)最早也是是一种二类分类模型,经过演进,现在成为了既能处理多元线性和非线性的问题,也能处理回归问题.在深度学习风靡之前,应该算是最好的分类算法.但目前SVM的应用仍然很多,尤其是在小样本集上. 一.目录 目录 感知机和其它知识 硬间隔与支持向量机 软间隔与支持向量机 合页损失函数 总结 二.感知机和其它知识(前戏) 2.1 感知机:

.NET中的三种Timer的区别和用法(转)

最近正好做一个WEB中定期执行的程序,而.NET中有3个不同的定时器.所以正好研究研究.这3个定时器分别是:  //1.实现按用户定义的时间间隔引发事件的计时器.此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用.  System.Windows.Forms.Timer  // 2.提供以指定的时间间隔执行方法的机制.无法继承此类.  System.Threading.Timer  //3.在应用程序中生成定期事件.  System.Timers.Timer  这三个定时器位

discuz2.5变量大全

<?php   /** * [Discuz!] (C)2001-2099 Comsenz Inc. * This is NOT a freeware, use is subject to license terms * * $Id: lang_admincp.php 31458 2012-08-30 03:39:40Z zhengqingpeng $ */   if(!defined('IN_DISCUZ')) { exit('Access Denied'); }     $lang = arr

System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差别和分别什么时候用

一.System.Windows.Forms.Timer 1.基于Windows消息循环,用事件方式触发,在界面线程执行:是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler.在这种Timer的EventHandler中可 以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的. 2.它是一个基于Form的计时器3.创建之后,你可以使用Interval设置Tick之间的跨

VC++或QT下 高精度 多媒体定时器

在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了.如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便.先要包含头文件"mmsystem.h"和库文 件"winmm.lib". 虽然Win95下可视化开发工具如VC.Delphi.C++   Builder等都有专用的定时器控件Timer,而且使用很方便,可以实现一定的定时功能,但

我的初学笔记

导览 1.Android UI a)Layout (CommonLayout,Adapter Layout) b)InputControls(Buttons,TextFileds,Bars) c)InputEvents(onClick,onKey,onTouch,onChecked) d)UI Components(Menu,ActionBar,Dialog,Notification,Toast,Setting) e)自定义view (直接或间接继承view,重写onDraw,自定义属性,资源回

定时器参考

1 //1.实现按用户定义的时间间隔引发事件的计时器.此计时器最宜用于Windows 窗体应用程序中,并且必须在窗口中使用. 2 3 System.Windows.Forms.Timer 4 5 6 7 // 2.提供以指定的时间间隔执行方法的机制.无法继承此类. 8 9 System.Threading.Timer 10 11 12 13 //3.在应用程序中生成定期事件. 14 15 System.Timers.Timer 16 17 18 19 这三个定时器位于不同的命名空间内,上面大概介

第8章 计时器

8.1 计时器的基本知识 (1)SetTimer时间参数:1毫秒到4294 967 295毫秒(近50天) (2)Windows本身处理BIOS中断,应用程序不需介入,Windows会每个计时器保持一个计数值,硬件时钟滴答一次,这个值减1.当计数为0时,发送WM_TIMER到消息队列,同时计数值重新恢复到原始值. (3)WIN98的计时器周期约为55毫秒,Windows NT大约为10毫秒.即SetTimer参数小于这个数值,则根据操作系统取其中的一个值.SetTimer会把指定的时间间隔舍入到