在做一个USB转CAN口的通信接收程序时候,程序一进行就会发生严重的内存不断增加的问题,直到程序死掉。小妹检查了下代码,好像问题出在这一段:
void CMainFrame::OnTimer(UINT nIDEvent)
{
CString str;
int index;
if(CAN.ReadCanStatus()==0)
{
CAN.m_DeviceStatus=0;
CAN.m_CANStatus=0;
CAN.OpenDevice();//可能发生了内存泄露的地方
CAN.StartCAN();
} if(1==CAN.m_CANStatus)
{
if(0==CAN.m_ThreadStatus)
{
InitializeCriticalSection(&m_Section);
AfxBeginThread(CAN.ReceiveThread,this);
CAN.m_ThreadStatus=1;
}
}
else if(1==CAN.m_ThreadStatus)
{
CAN.m_ThreadStatus=0;
DeleteCriticalSection(&m_Section);
} index=m_wndStatusBar.CommandToIndex(IDS_USBCAN);
if(CAN.m_CANStatus==false)
{
m_wndStatusBar.SetPaneText(index,"USBCAN断开");
}
else
{
m_wndStatusBar.SetPaneText(index,"USBCAN连接");
}
CFrameWnd::OnTimer(nIDEvent);
}这是一个定时去查看有没有连接上的函数,其中CAN.OpenDevice();//可能发生了内存泄露的地方,只要注释掉这句,就没有问题了。但这个打开设备的函数又是必须的。请高手指教。该函数内部是这样的:
bool CCAN::OpenDevice()
{
   InitInfo->kCanBaud=15;
   InitInfo->Timing0=0x00;
   InitInfo->Timing1=0x14;
   InitInfo->Filter=0;
   InitInfo->AccCode=0x80000008;
   InitInfo->AccMask=0xFFFFFFFF;
   InitInfo->Mode=0;
   InitInfo->CanRx_IER=1;
    int status =VCI_OpenDevice(m_DevType,m_DevIndex,0);
if(STATUS_OK==VCI_OpenDevice(m_DevType,m_DevIndex,0))
{
    m_DeviceStatus=TRUE;
if(VCI_InitCAN(m_DevType,m_DevIndex,m_CANNum,InitInfo)!=STATUS_OK)
{
VCI_CloseDevice(m_DevType,m_DevIndex);
}
}
else
{
m_DeviceStatus=false;
}
   return m_DeviceStatus;}谢谢啦,感激!}

解决方案 »

  1.   

    这样还是看不出问题,可能问题出在VCI开头那几个函数里吧
      

  2.   

    if(1==CAN.m_CANStatus)
    {
    if(0==CAN.m_ThreadStatus)
    {
    InitializeCriticalSection(&m_Section);
    AfxBeginThread(CAN.ReceiveThread,this); 
    CAN.m_ThreadStatus=1;
    }
    }
    else if(1==CAN.m_ThreadStatus)

    CAN.m_ThreadStatus=0;
    DeleteCriticalSection(&m_Section);
    }这么使用很不合理
      

  3.   

    int status =VCI_OpenDevice(m_DevType,m_DevIndex,0);
    if(STATUS_OK==VCI_OpenDevice(m_DevType,m_DevIndex,0))
    执行两遍?
    还有VCI_OpenDevice一般会对应一个close函数吧!
      

  4.   

    当VCI_OpenDevice打开的设备使用完后,最后调用VCI_CloseDevice把它关闭
      

  5.   

    不夸张,理论上确实不应该这样,但是定时器使用时间长了,系统越来越慢,程序占用N多的cpu时间与系统资源,关掉程序再开就又好了,过几小时又慢得不行了。