对话框程序,点确定按钮,执行死循环,想点取消而结束,但因无法接收消息,所以不能结束,如何处理这一问题? 对话框程序,点确定按钮,执行死循环,想点取消而结束,但因无法接收消息,所以不能结束,如何处理这一问题? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵呵 其实很简单 你可以用一个线程专门的进行你所说的死循环 然后在对话框程序点击取消的时候KILL这个线程就可以了 不是很简单吗????? 不应该也不能用GetMessage()应该用PeekMessage()MSG message;if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE)){::TranslateMessage(&message);::DispatchMessage(&message);}通过上面这段代码可以把控制权暂时还给主程序当然也可以用多线程--------------------------- May you succeed! ---------------------- MSG message;extern bool bAbort; // 应该是一个全局变量或成员变量,其值在按取消后设为truebAbort = false; while(1) // 死循环{ if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&message); ::DispatchMessage(&message); } if (bAbort) break; // 做其它事情} 如果是一个死循环你们说的什么MESSAGE都是没用的 因为死循环占用了所有的系统资源 程序根本不处理消息 如果是mfc程序可以用消息泵PumpMessage()例如:void CMyDlg::OnOKPressed(){ m_bIsCancelPressed=FALSE;//m_bIsCancelPressed 是成员 while(TRUE)//死循环 { if(m_bIsCancelPressed) break; if(!PeekAndPump())//重新写消息循环提取并发送消息,关键 break; }}void CMyDlg::OnCanclePressed(){ m_bIsCancelPressed=TRUE;}BOOL CMyDlg::PeekAndPump(){ MSG msg; while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(!AfxGetApp()->PumpMessage()) { ::PostQuitMessage(0); return FALSE; } } LONG lIdle=0; while(AfxGetApp()->OnIdle(lIdle++)); return TRUE;} 同意 nonocast(如果你信仰光明,那是因为到处都是黑暗!) ,你想知道更详细,你去看看技术内幕吧,里面说得很清楚.Good Luck. 验证密码的时候总是返回false 聊天程序有点问题? 一个见到的问题,关于CWinApp::LoadStandardCursor 请问UPNP类型的NAT,怎么进行静态端口映射? 请教有关阻塞的编程 怎样才能自己作安装程序啊, MFC CDatabase CDBException m_nRetcode 都是 -1 为什么 如何能获取对应的错误代码? 关于鼠标光标 如何制作一个类似资源管理器地址栏的Combox 南方冶金学院的请进!!!! AfxBeginThread 懂sdk编程的帮我看看!
应该用PeekMessage()
MSG message;
if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}通过上面这段代码可以把控制权暂时还给主程序
当然也可以用多线程---------------------------
May you succeed!
----------------------
extern bool bAbort; // 应该是一个全局变量或成员变量,其值在按取消后设为true
bAbort = false;
while(1) // 死循环
{
if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
if (bAbort) break; // 做其它事情
}
PumpMessage()
例如:
void CMyDlg::OnOKPressed()
{
m_bIsCancelPressed=FALSE;//m_bIsCancelPressed 是成员
while(TRUE)//死循环
{
if(m_bIsCancelPressed)
break;
if(!PeekAndPump())//重新写消息循环提取并发送消息,关键
break;
}
}
void CMyDlg::OnCanclePressed()
{
m_bIsCancelPressed=TRUE;
}
BOOL CMyDlg::PeekAndPump()
{
MSG msg;
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return FALSE;
}
}
LONG lIdle=0;
while(AfxGetApp()->OnIdle(lIdle++));
return TRUE;
}