是这样的,一个单文档程序,响应一个菜单选项,创建了一个用户界面线程(基于CWinThread),在InitInstance()里创建并显示了一个对话框,在这个对话框里面有一个按钮,响应函数里面是
for(int count=0;count<10;count++)
{
Sleep(50000);                        //延时一个心跳周期
if(!m_HeartGram)                         
{
if(!m_HostRequest)                   
{
       ;                 
}
else                                 
{
count=0;
}
}
else                                     
{
m_StandBy=TRUE;                      
m_SysState=2; } }
if(count==10)
{
m_Host=TRUE;                             
m_SysState=1;
}
单击按钮后对话框就进入了sleep函数,这时对话框出现“无响应”是正常的,但是为什么单文档也无法响应鼠标了啊?Sleep函数是阻塞所有的线程吗?

解决方案 »

  1.   

    Sleep只阻塞当前线程,因为你所有界面都是一个线程处理的,所以
      

  2.   

    不是的啊,单文档是一个线程,对话框是另一个线程啊(是派生自CWinThread啊)
      

  3.   

    我的理解,sleep了当前线程,让CPU分配时间片给其它
      

  4.   


    但MFC的消息处理只在一个线程中,只要你把消息处理线程给堵了,什么界面也无响应了.
    如果延时精度不需要很高,用下面这个函数.void DelayEx( DWORD times )
    {
        DWORD dwStart = GetTickCount();
        DWORD dwEnd = dwStart;
        do
        {
    MSG msg;
    if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
    {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
    }        dwEnd = GetTickCount();
        } while( ( dwEnd - dwStart )  <=  times );
    }
      

  5.   

    我感觉楼主的应该是这样的.sleep确定是只会阻塞一个线程.但你的理解错了.你的程序应该是一个主窗口派生了许多副窗口.每个窗口都有相应的窗口过程.但这并不代表你的程序就是多线程了.(多线程和多窗口是不一样的.)多线程一直得是你调用 CreateThread 或beginthread来创建的.你先确定你有没有调用上面的两个函数去创建线程.如果没有.那么不管你有多少窗口.一样是一个线程在处理.
    而你又把该线程给sleep了.当然就没响应了.你可以这样试下,调用CreateThread去创建一个线程.然后在该线程里创建窗口和窗口过程处理函数.应该就不会出现没有响应的问题了!个人的一点小见解!希望对你有帮助!
      

  6.   

    麻烦请你看清楚我是怎么说的,我是用afxbeginthread创建的对话框线程啊,也就是肯定有两个线程,我就是问为什的对话框线程sleep了,主线程对应的到文档也不能响应鼠标消息?
      

  7.   

    那要看你文档程序怎么写的,不一定是对话框线程sleep造成的。
      

  8.   

    你的对话框是不是单文档子窗口?
    两个窗口的线程之间可能会互发消息,如果一个卡住了,另一个也会卡住。
    你可以打开qq的群聊天窗口,那个公告是QQExternal.exe进程的窗口,你把QQExternal.exe进程挂起,然后再点群聊天窗口看是否有反应。
      

  9.   

    怎么判定两个窗口会互发消息呢,我是在单文档的一个菜单响应里用
    CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CExThread),0,0,NULL);创建的CExThread线程,然后在CExThread类里InitInstance()里调用的pDlg->Create(IDD_DIALOG1,NULL)创建 的对话框啊 
      

  10.   

    建议的方法是创建waitable timer,使用MsgWaitForMultipleObjectsEx和消息一并等待,如果是消息就GetMessage,DispatchMessage,这样可以使得界面有响应