zoukankan      html  css  js  c++  java
  • 关于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

  • 相关阅读:
    renderer:function参数介绍
    JSF request参数传递
    jsf初学解决faces 中文输入乱码问题
    JSF中获得HTTP SESSION和Request
    jquery、js调用iframe父窗口与子窗口元素的方法整理
    android 手势识别学习
    JAVA事件监听机制学习
    我的android学习脚步----------- 的第一个应用
    图像处理之哈哈镜的实现
    图像处理知识随笔
  • 原文地址:https://www.cnblogs.com/jzxx/p/3893404.html
Copyright © 2011-2022 走看看