程序中止 我的程序在用for循环时运行时,想在中途中止运行,但无法点击菜单项,也就无法中止,我该怎么办? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 MSG message; if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) { if (message.message == WM_KEYDOWN) { if(message.wParam == VK_ESCAPE) { OnCancel(); } } else ::TranslateMessage(&message); ::DispatchMessage(&message); }在for循环中加上 #define WM_STOPCVT WM_USER+100void CDlgMain::OnConvertdata() { if(!m_bCvting) m_bCvting=TRUE; else { PostMessage(WM_STOPCVT,0,0); return; } MSG msg; char tmp[10]; for(int i = 0; i< 500; i++) { PeekMessage(&msg, m_hWnd, 0, 0, PM_REMOVE); if(msg.message==WM_STOPCVT) goto exit; TranslateMessage(&msg); DispatchMessage(&msg); Sleep(10); SetWindowText(_itoa(i,tmp,10)); }exit: MessageBox("func end",NULL,NULL); m_bCvting=FALSE;} 判断你中止的条件break 或者return 都可以!! 在for循环中调用下面的函数void DoEvents(){ MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } return;} if (message.message == WM_KEYDOWN) { if(message.wParam == VK_ESCAPE) { OnCancel(); } }你是想用ESC键来终止程序吗?响应KEYDOWN事件不能做到的。去掉if (message.message == WM_KEYDOWN)这一句,或者改为其他建议使用事件模型,事件响应比较快。 后面不是有::TranslateMessage(&message); 另外一个办法是将for循环放在线程中 OnCancel();你可以改为你自己的要终止for后要做的东东. 我试了一下 程序没有响应VK_ESCAPE 消息 why? for(int i=1;i<=20;i++) { MSG message; if (m_bPreprocessA)//需要预处理 { if(AfxMessageBox("请先进行预处理",MB_OK|MB_ICONSTOP)==IDOK); {//预处理函数调用 } } if (m_bFirstInterp) {//是否需要划框 if(!m_bSetTrackWindFlag) { int flag=AfxMessageBox("请先划出目标框",MB_OK|MB_ICONSTOP); if (flag==IDOK) { m_bSetTrackWindFlag=TRUE; }//+ }//- } if(m_bCutBackgFlag) { //跟踪窗已划出 AutoInterpret(); } if (!m_bInterpating) {//如果判读中止 break; } if(::PeekMessage(&message, m_hWnd, 0, 0, PM_REMOVE)) { if (message.message == WM_KEYDOWN) { if(message.wParam == VK_ESCAPE) { m_bInterpating=false; } } else ::TranslateMessage(&message); ::DispatchMessage(&message); } } 简略 初始时 m_bInterpating=true; for(int i=1;i<=20;i++) { MSG message; AutoInterpret();//调用的一段程序 if (!m_bInterpating) {//如果判读中止 break; } if(::PeekMessage(&message, m_hWnd, 0, 0, PM_REMOVE)) { if (message.message == WM_KEYDOWN) { if(message.wParam == VK_ESCAPE) { m_bInterpating=false; } } else ::TranslateMessage(&message); ::DispatchMessage(&message); } } 我试了一下,可以.当按下"Esc"键,可能会延迟一会. 另外一个办法是将for循环放在线程中 自己工程怎样把第三方界面集成到我的工程里 界面显示问题 火了,被一个简单的问题搞得没办法!! 求助:向各位大哥请教在创建一个主窗体中的你个问题,谢谢! 求CJ60LIB库的使用手册 怎样获得IP地址,请各位侃侃 诸位高手:怎样才能实现数据库记录数据格式与INTERNET文件数据格式的相互转换 如何在win7任务栏中透明绘制按钮 关于 Run 怎样算是有基础? 关于VC学习 《windows程序设计》中一个不懂问题,诚请赐教! 安装程序要向注册表里写一个值!我该如何办呢?
{
if (message.message == WM_KEYDOWN)
{
if(message.wParam == VK_ESCAPE)
{
OnCancel();
}
}
else
::TranslateMessage(&message);
::DispatchMessage(&message);
}
在for循环中加上
#define WM_STOPCVT WM_USER+100
void CDlgMain::OnConvertdata()
{
if(!m_bCvting)
m_bCvting=TRUE;
else
{
PostMessage(WM_STOPCVT,0,0);
return;
} MSG msg;
char tmp[10];
for(int i = 0; i< 500; i++)
{
PeekMessage(&msg, m_hWnd, 0, 0, PM_REMOVE);
if(msg.message==WM_STOPCVT)
goto exit;
TranslateMessage(&msg);
DispatchMessage(&msg); Sleep(10);
SetWindowText(_itoa(i,tmp,10));
}exit:
MessageBox("func end",NULL,NULL);
m_bCvting=FALSE;
}
break 或者return
都可以!!
void DoEvents()
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return;
}
{
if(message.wParam == VK_ESCAPE)
{
OnCancel();
}
}
你是想用ESC键来终止程序吗?
响应KEYDOWN事件不能做到的。
去掉if (message.message == WM_KEYDOWN)这一句,或者改为其他
建议使用事件模型,事件响应比较快。
{
MSG message;
if (m_bPreprocessA)//需要预处理
{
if(AfxMessageBox("请先进行预处理",MB_OK|MB_ICONSTOP)==IDOK);
{//预处理函数调用
}
}
if (m_bFirstInterp)
{//是否需要划框
if(!m_bSetTrackWindFlag)
{
int flag=AfxMessageBox("请先划出目标框",MB_OK|MB_ICONSTOP);
if (flag==IDOK)
{
m_bSetTrackWindFlag=TRUE;
}//+
}//-
}
if(m_bCutBackgFlag)
{ //跟踪窗已划出
AutoInterpret();
}
if (!m_bInterpating)
{//如果判读中止
break;
}
if(::PeekMessage(&message, m_hWnd, 0, 0, PM_REMOVE))
{
if (message.message == WM_KEYDOWN)
{
if(message.wParam == VK_ESCAPE)
{
m_bInterpating=false;
}
}
else
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
for(int i=1;i<=20;i++)
{
MSG message;
AutoInterpret();//调用的一段程序
if (!m_bInterpating)
{//如果判读中止
break;
}
if(::PeekMessage(&message, m_hWnd, 0, 0, PM_REMOVE))
{
if (message.message == WM_KEYDOWN)
{
if(message.wParam == VK_ESCAPE)
{
m_bInterpating=false;
}
}
else
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}