解决方案 »

  1.   

    MFC:OnTimer在另一个线程运行啊,没有打断,各运行各的
      

  2.   

    "难道OnTimer还能打断其他的函数吗"
    指的是 MessageBox(...); ????
      

  3.   

    是不是说这样一种情况:
    执行了MessageBox,
    然后进入了OnTimer(因为MessageBox内部有消息循环,是有可能响应WM_TIME的),
    点击关闭MessageBox,
    但MessageBox没有立即关闭(OnTimer还在执行,消息循环阻塞了)
      

  4.   

    谁说在另一个线程运行这妹子或者是哥们不止一次这样了  习惯了...
    啥样?
    必须不是多线程啊.Ontimer单线程也可以实现的
      

  5.   


    我指的是会不会BTN1Clicked()函数未执行完,就执行OnTimer()函数。如果是这样,我的程序就会发生混乱。另外当我将MessageBox()注释掉时,试了几次,都是执行完BTN1Clicked()函数才会执行OnTimer()的,不知是怎么回事?
      

  6.   

    谁说在另一个线程运行这妹子或者是哥们不止一次这样了  习惯了...
    啥样?
    必须不是多线程啊.Ontimer单线程也可以实现的
    Ontimer的实现机制是不是通过开辟一个新线程?
      

  7.   

    谁说在另一个线程运行这妹子或者是哥们不止一次这样了  习惯了...
    啥样?
    必须不是多线程啊.Ontimer单线程也可以实现的
    Ontimer的实现机制是不是通过开辟一个新线程?你自己都不知道的事情  也没去验证  就去误人子弟了?
      

  8.   

    GetCurrentThreadID可以获取当前线程的ID,在OnTimer和主线程里都调用比较下就知道了,并没有创建多余的线程,OnTimer也没运行在其他线程里
      

  9.   

    谁说在另一个线程运行这妹子或者是哥们不止一次这样了  习惯了...
    啥样?
    必须不是多线程啊.Ontimer单线程也可以实现的
    Ontimer的实现机制是不是通过开辟一个新线程?你自己都不知道的事情  也没去验证  就去误人子弟了?
    不是有你这样的高人把关嘛,想误导也没得机会啊
      

  10.   

    那为什么我感觉OnTimer响应函数和主对话框里的函数运行是并行的?
      

  11.   

    谁说在另一个线程运行这妹子或者是哥们不止一次这样了  习惯了...
    啥样?
    必须不是多线程啊.Ontimer单线程也可以实现的
    Ontimer的实现机制是不是通过开辟一个新线程?我认为不用多线程也可以实现,例如:系统每次getmessage()的时候就作时间判断,如果大于一次间隔时间就插入一个WM_TIMER.MSDN原文:
    The WM_TIMER message is posted to the installing thread's message queue when a timer expires. The message is posted by the GetMessage or PeekMessage function. 
      

  12.   

    简单来讲,我就是想搞清楚程序何时会调用OnTimer(),要是任何情况下都能调用那就太坑爹了。
    MSDN上说:这句话的意思是说当应用程序消息队列中没有其他消息时,才会调用OnTimer()吧?也就是在必须是其他的消息响应函数执行完才有可能调用OnTimer()吧?而不可能是例如BTN1Clicked()函数执行一半,转而调用OnTimer()函数?不知我的理解是否正确?
      

  13.   

    这句话的意思是说当应用程序消息队列中没有其他消息时,才会调用OnTimer()吧?也就是在必须是其他的消息响应函数执行完才有可能调用OnTimer()吧?而不可能是例如BTN1Clicked()函数执行一半,转而调用OnTimer()函数?不知我的理解是否正确?你的理解是正确的.确实如此,所以WM_TIMER定时器机制不能保证2次调用OnTimer的间隔是严格的设定的值.
      

  14.   

    这句话的意思是说当应用程序消息队列中没有其他消息时,才会调用OnTimer()吧?也就是在必须是其他的消息响应函数执行完才有可能调用OnTimer()吧?而不可能是例如BTN1Clicked()函数执行一半,转而调用OnTimer()函数?不知我的理解是否正确?你的理解是正确的.确实如此,所以WM_TIMER定时器机制不能保证2次调用OnTimer的间隔是严格的设定的值.可是为什么在BTN1Clicked()函数中加上MessageBox(),就会出现BTN1Clicked()函数未执行完,就调用OnTimer()函数,MessageBox()有什么玄机吗?
      

  15.   

    这句话的意思是说当应用程序消息队列中没有其他消息时,才会调用OnTimer()吧?也就是在必须是其他的消息响应函数执行完才有可能调用OnTimer()吧?而不可能是例如BTN1Clicked()函数执行一半,转而调用OnTimer()函数?不知我的理解是否正确?你的理解是正确的.确实如此,所以WM_TIMER定时器机制不能保证2次调用OnTimer的间隔是严格的设定的值.可是为什么在BTN1Clicked()函数中加上MessageBox(),就会出现BTN1Clicked()函数未执行完,就调用OnTimer()函数,MessageBox()有什么玄机吗?LZ的问题我也不知道,可能问题在其他地方,可能是调试方法?最好LZ给出第一次setTimet的代码
      

  16.   

    timer 中断的 优先度 为 倒数 第 2. (>OnPaint)
    click 消息的 优先度 > timer , 所以 一定是 click 先执行,并要 执行完。
      

  17.   

    这句话的意思是说当应用程序消息队列中没有其他消息时,才会调用OnTimer()吧?也就是在必须是其他的消息响应函数执行完才有可能调用OnTimer()吧?而不可能是例如BTN1Clicked()函数执行一半,转而调用OnTimer()函数?不知我的理解是否正确?你的理解是正确的.确实如此,所以WM_TIMER定时器机制不能保证2次调用OnTimer的间隔是严格的设定的值.可是为什么在BTN1Clicked()函数中加上MessageBox(),就会出现BTN1Clicked()函数未执行完,就调用OnTimer()函数,MessageBox()有什么玄机吗?LZ的问题我也不知道,可能问题在其他地方,可能是调试方法?最好LZ给出第一次setTimet的代码BOOL CMyClass::OnInitDialog()
    {
        CDialog::OnInitDialog();
        dosomething;
        SetTimer(1,1000*1,NULL);
        return TRUE;
    }
    调试方法上,我就是在BTN1Clicked()函数中设多个断点,其中MessageBox()语句也设断点,单步执行时在OnTimer()函数中的第一条语句上设断点,每次程序执行到MessageBox()处时再按F10,执行OnTimer()的第一条语句,此后如果不删除OnTimer()函数中的断点,则程序始终在OnTimer()中执行,删除OnTimer()中的断点,则执行MessageBox(),即弹出对话框
      

  18.   

    MessageBox相对于一个模态对话框,是会阻塞父窗口的一些消息,注意是一些消息,不是所有消息
      

  19.   

    这句话的意思是说当应用程序消息队列中没有其他消息时,才会调用OnTimer()吧?也就是在必须是其他的消息响应函数执行完才有可能调用OnTimer()吧?而不可能是例如BTN1Clicked()函数执行一半,转而调用OnTimer()函数?不知我的理解是否正确?你的理解是正确的.确实如此,所以WM_TIMER定时器机制不能保证2次调用OnTimer的间隔是严格的设定的值.可是为什么在BTN1Clicked()函数中加上MessageBox(),就会出现BTN1Clicked()函数未执行完,就调用OnTimer()函数,MessageBox()有什么玄机吗?LZ的问题我也不知道,可能问题在其他地方,可能是调试方法?最好LZ给出第一次setTimet的代码BOOL CMyClass::OnInitDialog()
    {
        CDialog::OnInitDialog();
        dosomething;
        SetTimer(1,1000*1,NULL);
        return TRUE;
    }
    调试方法上,我就是在BTN1Clicked()函数中设多个断点,其中MessageBox()语句也设断点,单步执行时在OnTimer()函数中的第一条语句上设断点,每次程序执行到MessageBox()处时再按F10,执行OnTimer()的第一条语句,此后如果不删除OnTimer()函数中的断点,则程序始终在OnTimer()中执行,删除OnTimer()中的断点,则执行MessageBox(),即弹出对话框我擦,版主都来了.
      

  20.   

    可不可以这样理解,当click消息中没有MessageBox时,肯定是先执行click,并执行完。才有可能执行timer。通常情况下都应该如此。
    但是如果click中含有MessageBox,它阻塞了父窗口的一些消息,比如说click消息被阻塞了,但是比如说timer消息是没有被阻塞的。这时对于OnTimer来说,没有其他消息,也就可以响应timer消息了。
    ???
      

  21.   


    我的理解是messagebox这样的模态对话框,确实中断了父窗口的消息循环(while循环),但是由于messagebox自身也拥有消息队列,所以接管了一部分父窗口的消息来处理.不知这么理解对不对.
      

  22.   


    我的理解是messagebox这样的模态对话框,确实中断了父窗口的消息循环(while循环),但是由于messagebox自身也拥有消息队列,所以接管了一部分父窗口的消息来处理.不知这么理解对不对.我的描述不太准确.应该是说messagebox接管了消息循环,某些消息被dispatch出来了,有些滤掉了.
    谢谢大大
      

  23.   

     看看《windows程序设计》第八章-8.1.2计时器消息不是异步的,就理解了。
      

  24.   

    以前就遇到过类似问题。半天ontimer里面的图画不出来。
      

  25.   

    OnTimer的优先级很低,感觉它被别人打断的可能性更大
      

  26.   

    onTimer时间到了呗,然后messagebox就等他执行喽
      

  27.   

    想搞清楚关系的话,很简单,你不是在调试吗,看下调试窗口:Threads、call Stack,就清楚了。
      

  28.   

    同一线程不用考虑函数被中断,总会执行完了这个函数,才能通过调度执行其它函数。至于OnTimer,我想大概可以这样认为,最初由系统线程产生,然后PostMessage WM_TIMER 到你的界面线程的消息队列(多线程读取消息队列有个多线程同步), 然后界面线程取出回调给你注册的函数。//比如你的响应函数
    void OnTimer();
    //系统调用
    int GetMessageFromQueue()
    {
            //取队列消息
       switch(...)
       {
        case WM_TIMER:
            {
              OnTimer();
             }
       }
    }
      

  29.   

    虽然我的程序是多线程的,但是上面列出的两个函数肯定在同一个线程里,我调试过。问题的关键在MessageBox()函数,它执行起来很复杂,我不懂!