在程序中,我使用的一个定时器,定时对采集参数与设定参数进行比较,当采集参数比设定参数大时,弹出消息对话框进行警告。由于采集数据可能有一定的延迟,也就是说,当采集参数比设定参数大时,这种情况可能会持续几个定时器周期,因此,可能会弹出多个警告对话框。这是我不希望要的。因此,我通过设置标志位,其初值为false,当采集参数比设定参数大并且标志位为false时,弹出警告对话框,并将标志位置位true。当采集参数比设定参数小时,重先将标志位置false。但是,程序在运行的时候,如果弹出的警告对话框不及时点击确定的话,这个对话框仍然会在每个定时器周期都弹出来。请问一下,问题出在什么地方。是定时器问题,还是消息对话框的问题?谢谢各位!
{
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多的消息框。怎么能在没点击确定按钮的情况下,也只弹出一个消息框?
2、用Enabled试试
warning()//监控报警函数
{
if(m_Temperature_ProcessValue > m_Monitor_Temperature && Temperature_Overheat_Flag ==false) // //温度过高警告提示 {
Temperature_Overheat_Flag = true;
MessageBox("温度过高!!!");//,"警告",MB_ICONEXCLAMATION
Temperature_Overheat_Flag = false;
}
}
{
if(nIDEvent == m_timer)
{
::KillTime(nIDEvent);
MessageBox("温度过高!!!");//,"警告",MB_ICONEXCLAMATION
m_timer = SetTimer(1,1000,0);
else
CDialog::OnTimer(nIDEvent); }
if(m_Temperature_ProcessValue > m_Monitor_Temperature && Temperature_Overheat_Flag ==false) // //温度过高警告提示 {
Temperature_Overheat_Flag = true;
MessageBox("温度过高!!!");//,"警告",MB_ICONEXCLAMATION
} 因为模式对话框必须关闭后才会执行下面的语句,也就是说,按照你的代码,对话框弹出后不会执行到Temperature_Overheat_Flag = true;直至对话框关闭;而定时器消息仍然进来,就不停弹出对话框了。