查了一些以前的帖子,最后的结论似乎都是WM_TIMER是阻塞的,因为它是基于窗口进程的,并没有多线程的处理。我自己也写了一个测试程序证明的确没有多线程。但有一个现象自己一直想不通,按道理模式对话框应该阻塞的,但是我在一个定时器的处理函数里弹出一个模式对话框它应该会阻塞住,那么当进程在这个函数没有处理完时,不应该再继续下面的处理,这样下一个定时器消息也不应该会处理,但情况是对话框会不断弹出,请问这应该怎么解释????

解决方案 »

  1.   

    刚才查到大侠 Phourm() 关于此问题的解释,果然有道理。
    如果你是DoModal或者Create一个对话框或者其它有消息循环和响应的东东那你在消息队列里的消息就会被取出并且得到处理(GetMessage,TranslateMessage,DispatchMessage)
    所以你的TIMER消息不会被阻挡
    但是如果你在TIMER消息里是大量长时间的计算那你的消息就阻塞了,如果你用SLEEP试试就知道了,反过来说,如果你在这个长时间的计算中间用
    BOOL bRet;
    if( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)

        if (bRet == -1)
        {
            // handle the error and possibly exit
        }
        else
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    }
    这个,那么你的TIMER消息可能也会发生
    关键在GetMessage其实你不用MFC你用WIN32做你就要写很多这些东西了!
      

  2.   

    The DispatchMessage function forwards this message when no other messages are in the thread's message queue.
      

  3.   

    最简单的方法是在OnTimer事件中Timer1.Enable := false;......
    .....
    Form1.ShowModal;...
    ...
    Timer1.Enable := true;
      

  4.   

    我想,WM_TIMER非线程阻塞的,只是它的优先级很低,有其它线程执行时它就给塞掉了,若只有主线程,则它正常运行,我在主线程中用Timer与子线程好象感觉是这样