我怀疑是我定时器的原因,我设置的大约100ms闪一次,我的代码如下,但是确找不到具体哪不对,谢谢回答void CViewPropertySheet::OnTimer(UINT nIDEvent) 
{
CPropPage4* cp4;
CString weijie;
CString a;
CString  time;
CTime datime(2009,2,3);
strTimeStart2=datime;
CString str;
long lEventType,lResult;

#define  iDataBufLen  (MaxDataLen+1) //一共分配47个字节
char chDataBuf[iDataBufLen];
if(nIDEvent==1){
//if(m_bInit)//如果已经初始化成功就返回// return;
if(TV_Initialize())
{
TV_RegMsgWnd(GetSafeHwnd(),FALSE);//注册接受消息的窗口,和定时读取只需要同时使用一个
//初始化字符语音列表
TV_InitPlayStringList((LPTSTR)(LPCTSTR)(GetModulePath1()+"FileList.txt"));
m_bInit = TRUE;
CString str;
str.Format("初始化成功 序列号=%d 密码=%u",TV_GetSerial2(),TV_GetDevicePwd());


}
else
AddStatus("初始化失败");


bool  init= false;
        bool outit= false;

if(TV_RingDetect()!=0 && !init)
{
init=true;
SetActivePage(2);
            AdjustPages();
char Num[20];
TV_ReceiveCallingID(Num,20);
a.Format("%s ", Num);

if(a.GetLength()!=0){
cp4 =  (CPropPage4 *)GetActivePage();
cp4->ReCall(a);

time = CTime::GetCurrentTime().Format("%Y-%m-%d %H:%M:%S");


if(TV_GetTelState()==true)
{
outit = FALSE;
strTimeStart2=CTime::GetCurrentTime();
}

if( TV_GetTelState()==false)
{
init=FALSE;
outit=false;
strTimeEnd2=CTime::GetCurrentTime();
if(strTimeStart2==datime){
weijie="未接";
CString timelen="0";
                        cp4->TelHistory0(time,timelen,a,weijie);
}else{
CTimeSpan   cts=strTimeEnd2-strTimeStart2;  
CString   timelen=cts.Format("%H:%M:%S");

weijie="来电";
cp4->TelHistory0(time,timelen,a,weijie);
}
}
}
}


}
if(nIDEvent==2)
{
if(TV_Initialize())
{
TV_RegMsgWnd(GetSafeHwnd(),FALSE);//注册接受消息的窗口,和定时读取只需要同时使用一个
//初始化字符语音列表
TV_InitPlayStringList((LPTSTR)(LPCTSTR)(GetModulePath1()+"FileList.txt"));
m_bInit = TRUE;
CString str;
str.Format("初始化成功 序列号=%d 密码=%u",TV_GetSerial2(),TV_GetDevicePwd());

}
else
AddStatus("初始化失败");
bool =false;
bool 1=false;
    cp4 =  (CPropPage4 *)GetActivePage();
if(cp4->sign==true)
{
   if (TV_IsTalkState()==true)
   {
   =true;
   }
   if (==true && TV_GetTelState()==false)
   {
   cp4->strTimeEnd4=CTime::GetCurrentTime();
               CTimeSpan   cts=cp4->strTimeEnd4-cp4->strTimeStart4;  
  CString   timelen=cts.Format("%H:%M:%S");
  weijie="去电";
  cp4->TelHistory0(time,timelen,a,weijie);
   }
}
}
if(nIDEvent==4){ cp4 =  (CPropPage4 *)GetActivePage(); if (TV_GetTelState()==true)
{
if (!m_bool)
{
     m_bool = true;
m_time1 = CTime::GetCurrentTime().Format("%Y-%m-%d %H:%M:%S");
}

if (GetActiveIndex() != 2)
{
SetActivePage(2);
AdjustPages();
}
long lRet=TV_GetEventEx(&lEventType,&lResult,chDataBuf,iDataBufLen);
            cp4 =  (CPropPage4 *)GetActivePage();
if(lRet < 0) MessageBox("chDataBuf的内存长度分配不够");
else if(lRet > 0)
{
if (lEventType==TEvent_TelDial)
{
str.Format("%s",chDataBuf);
//MessageBox(str);
cp4->m_calling=str;
cp4->UpdateData(false);
// time = CTime::GetCurrentTime().Format("%Y-%m-%d %H:%M:%S");

}



}
// AfxMessageBox("TV_GetTelState==true");
}


if (TV_GetTelState()==false && TV_GetPcState()==false  && m_bool==true )
{
m_bool=false;

CTimeSpan   cts=strTimeEnd2-strTimeStart2;  
CString   timelen=cts.Format("%H:%M:%S");
CString str2;
    str2=cp4->m_calling;
weijie="去电";

if(timelen.Find("-")==0){
 timelen="00:00:00";
}
     cp4->TelHistory0(m_time1,timelen,str2,weijie);




}

}

}

解决方案 »

  1.   

    这个函数是您自己写的吧,感觉可能是TelHistory0导致长时间运行内存不够用进而崩了~~
      

  2.   

    谢谢楼上的回答,首先,我们这边的物理内存很大,是4g的,不过xp只能识别3.2g,这个函数是我写的,但是不符合条件,这个函数是不会执行的,
      

  3.   

    资源管理器看看程序运行时,有咩有内存不断增加,vc运行退出的是很,out有没有内存泄漏提示
      

  4.   

    在程序中增加诸如TRACE("timelen=%s\n",timelen);等等调试语句,运行程序,观察TRACE的输出结果,看看各个变量值是否如你预计的那样。