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

  • 相关阅读:
    hdu5728 PowMod
    CF1156E Special Segments of Permutation
    CF1182E Product Oriented Recurrence
    CF1082E Increasing Frequency
    CF623B Array GCD
    CF1168B Good Triple
    CF1175E Minimal Segment Cover
    php 正则
    windows 下安装composer
    windows apache "The requested operation has failed" 启动失败
  • 原文地址:https://www.cnblogs.com/jzxx/p/3893404.html
Copyright © 2011-2022 走看看