首页 新闻 搜索 专区 学院

MFC_release版,在按钮触发事件后,程序运行不正确,是阻塞了吗?

0
悬赏园豆:5 [已解决问题] 解决于 2012-11-13 14:53

如图为一个简单的对话框:其中暂停键的消息处理函数为:

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程序好像被阻塞了,请高人指点,谢谢。

百炼钢成绕指柔的主页 百炼钢成绕指柔 | 初学一级 | 园豆:199
提问于:2012-11-05 18:51
< >
分享
最佳答案
0

MFC程序主线程和界面线程应该是一个吧,最好使用新的线程处理这个

while(m_bRun) 这个估计把线程资源全部占用了,分配不到按钮的处理

收获园豆:5
2012 | 高人七级 |园豆:21007 | 2012-11-05 19:56

怎么使用新的线程呢?

在debug模式下,是可以正常运行的,是不是release模式下执行了某些优化造成的,可不可以解释一下为什么加了AfxMessageBox后,可以正常运行是什么情况?

百炼钢成绕指柔 | 园豆:199 (初学一级) | 2012-11-05 20:00

@百炼钢成绕指柔: 按钮的响应时消息队列处理的,和你的主函数是交错运行的,某个时刻就会出现你的问题,和那个模式无关,加AfxMessageBox后,处理线程阻塞,因此消息队列又可处理了

CreateThread beginthread这些函数看看

2012 | 园豆:21007 (高人七级) | 2012-11-06 13:28

@2012: 谢谢,现在问题已经解决了,主要是不能让while循环体空着,在while循环体中加入等待函数即可解决问题了。

百炼钢成绕指柔 | 园豆:199 (初学一级) | 2012-11-13 14:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册