不是说MessageBox会导致程序暂停执行吗?
怎么可以通过WM_TIME消息可以让一个线程弹出多个MessageBox

解决方案 »

  1.   

    timer本身是多线程吧,如果弹出框在timer对应的函数里边,那么弹出框只是阻止了此消息函数向下运行,下一个时间点到时还会运行此消息函数的。
      

  2.   

    不是说MessageBox会导致程序暂停执行吗? 
      
    谁说的?
    MessageBox相当于模态对话框,拦截了线程的键盘和鼠标消息,但是其他消息照样可以得到处理
      

  3.   

    为什么可以得到处理啊?
    主窗口的窗口函数调用了OnTimer
    OnTimer里面调用了Messagebox
    只要不点击确定,MessageBOx函数就不退出
    OnTimer也就不退出
    主窗口的窗口函数无法返回
    主窗口的消息循环被卡死问题是还能弹出在其他的MessageBox,说明WM_TIMER 得到了处理。
    这个处理肯定不是再主窗口的消息循环里面处理的。也就是说MessageBox内部应该有一个循环,在不停地处理主窗口队列里面的消息。
    应该是这样吧。
      

  4.   

    timer本身是多线程吧
    ======
    timer并不是多线程的
      

  5.   

    WM_TIMER消息是不会被弹住的
    你想想看,如果MessageBox能把所有的消息都弹住,
    我用其它窗口子你的界面上晃两下,那你的界面岂不是面目全非了
      

  6.   

    这样看来DoModal()函数内有类似中断的处理方式,保留了当前运行地址,然后跳出函数,回到消息循环。在响应到对话框关闭的消息后,又进入保存的地址继续执行。
      

  7.   

    WM_TIMER消息不是多线程的,你在一个线程内设置timer,那么定时会有消息投递到这个线程的消息队列。系统并不会直接调用timerproc函数,而是调用DispatchMessage处理WM_TIMER之后才会调用timerproc函数。最简单的测试方法是写一个console程序,由于它默认没有消息循环,这时你设置timer时,会无效。但是你自己加上消息循环就有效了。
    MessageBox会阻塞程序,但在其内部有消息循环,因此不会阻塞线程消息处理。但是事实上,每处理一次TIMER消息,弹出一个对话框,由于前一个没有点确定,也就是说上一个TIMER消息也是没有处理完的。这样不断递归,最终会耗尽资源。