是这样的,一个单文档程序,响应一个菜单选项,创建了一个用户界面线程(基于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函数是阻塞所有的线程吗?
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函数是阻塞所有的线程吗?
但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 );
}
而你又把该线程给sleep了.当然就没响应了.你可以这样试下,调用CreateThread去创建一个线程.然后在该线程里创建窗口和窗口过程处理函数.应该就不会出现没有响应的问题了!个人的一点小见解!希望对你有帮助!
两个窗口的线程之间可能会互发消息,如果一个卡住了,另一个也会卡住。
你可以打开qq的群聊天窗口,那个公告是QQExternal.exe进程的窗口,你把QQExternal.exe进程挂起,然后再点群聊天窗口看是否有反应。
CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CExThread),0,0,NULL);创建的CExThread线程,然后在CExThread类里InitInstance()里调用的pDlg->Create(IDD_DIALOG1,NULL)创建 的对话框啊