我先执行ONtimer,一切正常,然后点击1次按钮OnStoprecv用killtimer(1),停止了settimer,,当我再次点击他时,执行settimer,因为在ONtimer里编号了,所以我认为ontimer应该重头执行,可他为什么不把第一个数据给我的控件变量呢,请问错再哪了,
void CCommDlg::OnButton1() 
{
UpdateData(TRUE);
if(m_hexsend.GetCheck())
{
CByteArray data;
int len=Str2Hex(m_SendData,data);
m_Comm.SetOutput(COleVariant(data));//发送数据
}
else m_Comm.SetOutput(COleVariant(m_SendData));//发送数据
SetTimer(1,1000,NULL);
}
void CCommDlg::OnStoprecv() 
{
UpdateData();
static int n=0;
{
n++;
if(n==1)
{
m_stop.SetWindowText("继续监测");
KillTimer(1);
UpdateData(FALSE);
                   }
if(n==2)
{
m_stop.SetWindowText("暂停监测");
OnTimer(1);
UpdateData(FALSE);
}
}
}
void CCommDlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call defaultstatic int y=0;
switch (nIDEvent)
{
       case 1:    
     y++;
     OnButton1() ;    //发送数据
 {     
 if(y==1)
 {    
 //SetDlgItemText(IDC_cszl1,kk);
 m_cszl1=kk.Right(5);;
UpdateData(FALSE);
 }    
 else
 {
//m_ReceiveData+=str;
         m_ReceiveData=kk.Right(5);
UpdateData(FALSE);
 }
  
 }
 break;

//UpdateData(FALSE);
  CDialog::OnTimer(nIDEvent);
}
}

解决方案 »

  1.   

    你在OnTimer中连续调用OnButton1(),而每个OnButton1()又调用了SetTimer(1,1000,NULL);,也就是说你在不停的创建定时器
      

  2.   

    因为定时器是消息.比如你定时周期是1000ms,当1000ms未到时,你又调用SetTimer,则会重头计时,即使已经999ms了,也会重新从0开始计时.再有,你y是静态变量,在前面定时时,其值已经被修改.重新SetTimer并不会让y值从新回到0,所以你只有在调用SetTimer之前重新初始化其值,但是y的作用域只有OnTimer函数中,所以你要想办法把其拿出来在外面定义才能修改.