在做一个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;}谢谢啦,感激!}
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;}谢谢啦,感激!}
解决方案 »
- 快速打印
- 请教关于SQL查询语句的问题
- 关于CS模式,数据库直连的安全问题??
- 如何用COleDropTarget类实现带链接的图片拖曳
- 急请高手指点:关于网络连接的几个问题
- 在线急等 VC中备份SQL SEVER2000的数据库成功,为什么在恢复的时候出错啊?
- 问个问题:在javascript中external.menuArguments.document做为com中一个参数,在com中的参数类型是什么类型?
- 我找了一份7张光盘的VisualStudio.NET 7.0,但是第二张盘有问题,哪位朋友可以告诉我在哪儿可以下载到第二张光盘
- GDI+绘制资源中的位图
- 怎样在一个exe文件里直接打包我要的文件?就象安装文件一样啊。
- WSASend()如果返回0,GetQueuedCompletionStatus 还能否收到消息?
- 新手请教:我用VS2005里的Smart Device里的MFC一直了一个录放音的对话框程序,运行没错误,但下载到板子上执行时有问题
{
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);
}这么使用很不合理
if(STATUS_OK==VCI_OpenDevice(m_DevType,m_DevIndex,0))
执行两遍?
还有VCI_OpenDevice一般会对应一个close函数吧!