如图为一个简单的对话框:其中暂停键的消息处理函数为:
m_bRun的初始值为FALSE。
void ClanetestDlg::OnBnClickedStop()
{
// TODO: 在此添加控件通知处理程序代码
if(m_bRun==TRUE)
{
m_bRun=FALSE;
GetDlgItem(IDC_STOP)->SetWindowText(CString("暂停"));
//MessageBox(CString("false"));
}
else
{
m_bRun=TRUE;
GetDlgItem(IDC_STOP)->SetWindowText(CString("继续"));
//MessageBox(CString("true"));
}
}
然后主函数是对输入视频的每一帧进行处理,当第一次执行了暂停功能后,“暂停”按钮变为“继续”,此时为了实现暂停功能,即等待状态,在主程序中加入了一个由m_bRun控制的while循环:即:
while(m_bRun){}
接下来,问题出现了。。。。
当我按下“继续”按键,希望程序继续执行时,在debug下可以按照预期的想法正常运行,在release版本下却一直处于等待状态,只有按“取消”键结束程序。
但是如果我在release下把等待处理代码改为:
while(m_bRun){
AfxMessageBox(CString("break"));
}
在弹出“break”对话框后,点击该对话框上的确定键,程序则可以继续执行。
由于本人是初接触MFC的知识,对其中的奥妙知之甚少,不知道为什么不加AfxMessageBox程序好像被阻塞了,请高人指点,谢谢。
MFC程序主线程和界面线程应该是一个吧,最好使用新的线程处理这个
while(m_bRun) 这个估计把线程资源全部占用了,分配不到按钮的处理
怎么使用新的线程呢?
在debug模式下,是可以正常运行的,是不是release模式下执行了某些优化造成的,可不可以解释一下为什么加了AfxMessageBox后,可以正常运行是什么情况?
@百炼钢成绕指柔: 按钮的响应时消息队列处理的,和你的主函数是交错运行的,某个时刻就会出现你的问题,和那个模式无关,加AfxMessageBox后,处理线程阻塞,因此消息队列又可处理了
CreateThread beginthread这些函数看看
@2012: 谢谢,现在问题已经解决了,主要是不能让while循环体空着,在while循环体中加入等待函数即可解决问题了。