关于定时器的问题

时间:2021-10-17 23:24:33
我做了一个tab页,上面有有个定时器,我的定时器是,时刻监视,如果满足促发条件就去做一些操作,做完这个操作后,我就关掉这个定时器,我的代码如下,可是当执行完那个操作的时候,定时器并没有被关掉,是怎么回事?谢谢回答

BOOL CViewPropertySheet::OnInitDialog() 
{
  ModifyStyleEx(0,WS_EX_CONTROLPARENT);
BOOL bResult = CPropertySheet::OnInitDialog();
   SetTimer(1,1000,NULL); //<<-----定时器在这里设置的
// Resize the CTabCtrl and PropertyPages
PostMessage(WM_ADJUST);

return bResult;
}



void CViewPropertySheet::OnTimer(UINT nIDEvent) 
{

       
 SetActivePage(2);
 char Num[20];
         CPropPage4 cp4;
         CString a="0,,13969110924";
         cp4.ReCall(a);
 KillTimer(1);
}


CString CPropPage4::ReCall(CString PhoNum)
{
   try
{
m_pConnection.CreateInstance("ADODB.Connection");
CString strConnect="Provider=Microsoft.Jet.OLEDB.4.0;\
        Data Source=Database\\City.mdb;Persist Security Info=False";
m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接错误",0,0);
}
    
    m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset_tel.CreateInstance(__uuidof(Recordset));
m_pRecordset_home.CreateInstance(__uuidof(Recordset));
CString sql;
    sql.Format("select * from TreeItem where SecNum = '%s' ",PhoNum);
     _variant_t   vt;   
     vt.vt   =   sql.IsEmpty() ? VT_NULL:VT_BSTR;   
     vt.bstrVal  = sql.AllocSysString();
m_pRecordset->Open(vt,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
if(m_pRecordset->adoEOF)
{
    CString sqltel;
       sqltel.Format("select * from TreeItem where tel = '%s' ",PhoNum);
       _variant_t   vt1;   
       vt1.vt   =   sqltel.IsEmpty() ? VT_NULL:VT_BSTR;   
       vt1.bstrVal  = sqltel.AllocSysString();
   m_pRecordset_tel->Open(vt1,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
       if(m_pRecordset_tel->adoEOF)
   {
      CString sqlwork;
       sqlwork.Format("select * from TreeItem where work = '%s' ",PhoNum);
       _variant_t   vt2;   
       vt2.vt   =   sqlwork.IsEmpty() ? VT_NULL:VT_BSTR;   
       vt2.bstrVal  = sqlwork.AllocSysString();
   m_pRecordset_home->Open(vt2,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
       if(m_pRecordset_home->adoEOF)
   {
     m_strEdit_name="未知";
         m_strEdit_phonum=PhoNum;
   }
   else{
   CString tel,name,work;
    name=(LPCTSTR)(_bstr_t)m_pRecordset_home->GetCollect("Name");
         work=(LPCTSTR)(_bstr_t)m_pRecordset_home->GetCollect("ParentItem");
     tel=(LPCTSTR)(_bstr_t)m_pRecordset_home->GetCollect("SecNum");
         m_strEdit_name=name;
 m_strEdit_tel=work;
 m_strEdit_phonum=tel;
 UpdateData(true);
   }
   }
   else{
       CString tel2,name2,work2;
    name2=(LPCTSTR)(_bstr_t)m_pRecordset_tel->GetCollect("Name");
         work2=(LPCTSTR)(_bstr_t)m_pRecordset_tel->GetCollect("ParentItem");
     tel2=(LPCTSTR)(_bstr_t)m_pRecordset_tel->GetCollect("SecNum");
         m_strEdit_name=name2;
 m_strEdit_tel=work2;
 m_strEdit_phonum=tel2;
 UpdateData(true);
   }
}
else
{
 CString tel3,name3,work3;
    name3=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Name");
         work3=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("ParentItem");
     tel3=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("SecNum");
         m_strEdit_name=name3;
 m_strEdit_tel=work3;
 m_strEdit_phonum=tel3;
 UpdateData(true);
 MessageBox("123");
 MessageBox("456");
}
KillTimer(1);
return "";
}

代码如上,请问这样设置定时器对吗?为什么我的定时器kill不掉,会一直执行呢

7 个解决方案

#1


定时器被kill了两次啊。你看看到底有没有走killTimer那段。还有就是setTimer了几次。如果当时被kill了,又重新创建了也不会停止。、

还有就是你有try Catch,是不是捕获到异常,直接中断了,没有继续往下走。

#2


自己顶

#3


我的定时器只要一执行到killTimer就开始执行ontime,这是怎么回事?

#4


void CViewPropertySheet::OnTimer(UINT nIDEvent) 
{
    
      if(1 == nIDEvent)
     {   
     SetActivePage(2);
     char Num[20];
         CPropPage4 cp4;
         CString a="0,,13969110924";
         cp4.ReCall(a);
     KillTimer(1);
     }
}

#5


你把定时器的时间放长,比如5-10秒,然后看走的逻辑。还有,到底是哪个killTimer起作用的
BOOL KillTimer( int nIDEvent );是个BOOL值,你可以监视下其返回值是否正确。多打点TRACE数据出来

#6


把KillTimer放到OnTimer第一句,初步估计是你的MessageBox阻断了

#7


6楼的这样就可以kill掉了,谢谢

#1


定时器被kill了两次啊。你看看到底有没有走killTimer那段。还有就是setTimer了几次。如果当时被kill了,又重新创建了也不会停止。、

还有就是你有try Catch,是不是捕获到异常,直接中断了,没有继续往下走。

#2


自己顶

#3


我的定时器只要一执行到killTimer就开始执行ontime,这是怎么回事?

#4


void CViewPropertySheet::OnTimer(UINT nIDEvent) 
{
    
      if(1 == nIDEvent)
     {   
     SetActivePage(2);
     char Num[20];
         CPropPage4 cp4;
         CString a="0,,13969110924";
         cp4.ReCall(a);
     KillTimer(1);
     }
}

#5


你把定时器的时间放长,比如5-10秒,然后看走的逻辑。还有,到底是哪个killTimer起作用的
BOOL KillTimer( int nIDEvent );是个BOOL值,你可以监视下其返回值是否正确。多打点TRACE数据出来

#6


把KillTimer放到OnTimer第一句,初步估计是你的MessageBox阻断了

#7


6楼的这样就可以kill掉了,谢谢