在程序中,我使用的一个定时器,定时对采集参数与设定参数进行比较,当采集参数比设定参数大时,弹出消息对话框进行警告。由于采集数据可能有一定的延迟,也就是说,当采集参数比设定参数大时,这种情况可能会持续几个定时器周期,因此,可能会弹出多个警告对话框。这是我不希望要的。因此,我通过设置标志位,其初值为false,当采集参数比设定参数大并且标志位为false时,弹出警告对话框,并将标志位置位true。当采集参数比设定参数小时,重先将标志位置false。但是,程序在运行的时候,如果弹出的警告对话框不及时点击确定的话,这个对话框仍然会在每个定时器周期都弹出来。请问一下,问题出在什么地方。是定时器问题,还是消息对话框的问题?谢谢各位!

解决方案 »

  1.   

    在定时器响应函数中使用静态或者全局的BOOL变量才能阻止重入,栈变量都是独立的,无法阻止重入
      

  2.   

    把与标志有关的代码贴上,标志最好定义为对话框类的成员变量。另外,你也可以不使用标志,通过IsWindowEnabled来判断,如果对话框被禁用,说明当前已经有消息框弹出。
      

  3.   

    建议你采用日志方式或者用Edit,view之类的来显示你要弹出的信息,而不是采用对话框消息模式!
      

  4.   

    BOOL CInterfaceDlg::OnInitDialog()
    {
    m_timer = SetTimer(1,1000,0);                           //定时器设置,在本程序中,通过定时读取数据并更新显示
    Temperature_Overheat_Flag = false;
    return TRUE;  // return TRUE  unless you set the focus to a control
    }
    warning()//监控报警函数
    {
    if(m_Temperature_ProcessValue > m_Monitor_Temperature && Temperature_Overheat_Flag ==false)   //                                 //温度过高警告提示

    {
    MessageBox("温度过高!!!");//,"警告",MB_ICONEXCLAMATION
    Temperature_Overheat_Flag = true;
    }
      else if (m_Temperature_ProcessValue < m_Monitor_Temperature)
      {
      Temperature_Overheat_Flag = false;
      }
    }void CInterfaceDlg::OnTimer(UINT nIDEvent)   //在定时器中响应此函数,定时时间为1s
    {
    // TODO: Add your message handler code here and/or call default
    Warning();

    CDialog::OnTimer(nIDEvent);

    }
    如果消息框在弹出的瞬间点击确定按钮,就可以满足要求,但是如果长时间不点击,则弹出N多的消息框。怎么能在没点击确定按钮的情况下,也只弹出一个消息框?
      

  5.   

    1、定时器响应函数用全局bool,或静态变量
    2、用Enabled试试
      

  6.   

    这样改:
    warning()//监控报警函数 

    if(m_Temperature_ProcessValue > m_Monitor_Temperature && Temperature_Overheat_Flag ==false)  //                                //温度过高警告提示 { 
    Temperature_Overheat_Flag = true; 
    MessageBox("温度过高!!!");//,"警告",MB_ICONEXCLAMATION 
    Temperature_Overheat_Flag = false; 


      

  7.   

    void CInterfaceDlg::OnTimer(UINT nIDEvent)  //在定时器中响应此函数,定时时间为1s 

          if(nIDEvent == m_timer)
          {
              ::KillTime(nIDEvent);
              MessageBox("温度过高!!!");//,"警告",MB_ICONEXCLAMATION 
              m_timer = SetTimer(1,1000,0);
          else   
             CDialog::OnTimer(nIDEvent); } 
      

  8.   

    Temperature_Overheat_Flag = true写在messagebox前面
      

  9.   

    改变顺序:
    if(m_Temperature_ProcessValue > m_Monitor_Temperature && Temperature_Overheat_Flag ==false)  //                                //温度过高警告提示 { 
    Temperature_Overheat_Flag = true; 
    MessageBox("温度过高!!!");//,"警告",MB_ICONEXCLAMATION 
    } 因为模式对话框必须关闭后才会执行下面的语句,也就是说,按照你的代码,对话框弹出后不会执行到Temperature_Overheat_Flag = true;直至对话框关闭;而定时器消息仍然进来,就不停弹出对话框了。