请教大家一个问题。如果一个线程执行到了MessageBox函数,这个线程现在是什么状态?这个状态与执行Sleep();之后线程的状态完全不同。举个例子,在线程A中创建并显示一个窗口,然后马上执行函数MessageBox,此事,显示出来的这个窗口上的按钮是可以点击的,也就是说,这个窗口是可操作的。但是如果,在线程A中穿件并显示一个窗口,然后马上执行函数Sleep,此事,显示出来的这个窗口处于“未响应”状态,也就是怎么点都没反应的那种。请问执行到MessageBox函数之后,线程的状态是什么,还有什么类似的函数能有这个功能,让线程进入这个状态。

解决方案 »

  1.   

    执行到MessageBox,当前线程应该被阻塞了,但是是活动的。而Sleep时,当前线程将CPU让给了其它线程,它自己会小睡一会儿,时间根据Sleep的参数而决定,醒来后接着执行。
      

  2.   

    如果一个线程执行到了MessageBox函数,这个线程现在是什么状态?这个状态与执行Sleep();之后线程的状态完全不同。
    ==========
    这两个在本质上是不同的。
    Sleep()是线程挂起,也就是说此时线程的状态是休眠的,并不会被调度到。
    MessageBox其实是一个模态对话框,它的工作原理是因为模态对话框内部有一个消息循环,所以消息被MessageBox弹出的对话框截获了,造成了主界面不可操作,它所在的线程是活动的。
      

  3.   

    执行到MessageBox,当前线程应该被阻塞了,但是是活动的。
    =========
    不对,这里没有阻塞一说,只是模态对话框内部的消息循环截取了消息,造成主界面收不到消息。你可以做一个试验:你在一个定时器中弹出MessageBox,你会发现,即使你不关闭弹出的对话框,MessageBox也会不停地弹出来。
      

  4.   

    有意思
    MessageBox(NULL,TEXT("abc"),NULL,NULL);
    MessageBox(NULL,TEXT("222"),NULL,NULL);
    肯定是第一个对话框消失之后才会显示第2个对话框,貌似是线程被暂停了,但是却完全不影响消息的接收,可程序只有一个线程
      

  5.   

    如果你非要实现这个效果也是可以的,完全可以模拟它的方法,你可以自己写while(!GetMessage(&msg,NULL,NULL,NULL))
    {
    ....
    }
      

  6.   

    如果只是想让某个线程处于等待状态,试试用WaitForSingleObject等待Event的方式不知是否能满足你的需求
      

  7.   

    你把弹出的窗口句柄传给MessageBox看看,界面就不可操作了!主要原因还是二楼说的!
      

  8.   

    MessageBox和显示一个模态窗口是一样的啊,只是MessageBox是MS做好的窗口。楼主可以自己做一个只有一个确定按钮和一个label的窗口,然后DoModal之,效果和MessageBox是一样的啊。
      

  9.   

    16楼的回答绝对可以的,甚至设置时间为INFINITE,直到等到事件发生