线程中调用海康威视动态链接库NET_DVR_GetDVRWorkState_V30函数堆栈溢出问题

gtbmx 2012-08-28 11:59:27
本人最近使用海康威视的SDK做停车场管理软件

现在需要做一个检测函数,定时检测各个设备的连接状态,对海康的硬盘录像机使用NET_DVR_GetDVRWorkState_V30检测硬盘录像机网络是否连接正常。该函数原型如下:

BOOL NET_DVR_GetDVRWorkState_V30( LONG lUserID, LPNET_DVR_WORKSTATE_V30 lpWorkState);

Parameters
lUserID
[in] NET_DVR_Login或者NET_DVR_Login_V30的返回值
lpWorkState
[out] 获取的设备工作状态结构体参数

Return Values
TRUE表示成功,FALSE表示失败,获取错误码调用NET_DVR_GetLastError

由于该函数不立即返回,在主线程里调用该函数在断网的情况下会造成阻塞,所以我起了线程,我自己的线程如下:


UINT CParkingDlg::CheckNVRState(LPVOID pParam)
{
NET_DVR_WORKSTATE_V30 state;
CParkingDlg * pObject =(CParkingDlg*)pParam;
while(1)
{
if(NET_DVR_GetDVRWorkState_V30(pObject->m_lId,&state)==0) //m_lId是设备连接返回的设备ID;
{
pObject->m_nState=pObject->m_nState | NVR_ERROR; //如果连接不正常,系统状态标记改变
}
else
{
pObject->m_nState=pObject->m_nState & ~NVR_ERROR;

}
Sleep(1000);
}
return 0;
}


经过测试,我在主线程无论在断网或者不断网的情况下调用该函数多少次都不会出错。
但是在线程中,一旦断网,该该函数第一次可以正常执行,但是第二次执行该函数是会报错:
Parking.exe 中的 0x77dc15de 处有未经处理的异常: 0xC0000005: 读取位置 0xcccccc01 时发生访问冲突
程序停留在thrdcore.cpp文件的如下位置:

BOOL AFXAPI AfxInternalPumpMessage()
{
_AFX_THREAD_STATE *pState = AfxGetThreadState();

if (!::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL))
{
#ifdef _DEBUG
TRACE(traceAppMsg, 1, "CWinThread::PumpMessage - Received WM_QUIT.\n");
pState->m_nDisablePumpCount++; // application must die
#endif
// Note: prevents calling message loop things in 'ExitInstance'
// will never be decremented
return FALSE;
}

#ifdef _DEBUG
if (pState->m_nDisablePumpCount != 0)
{
TRACE(traceAppMsg, 0, "Error: CWinThread::PumpMessage called when not permitted.\n");
ASSERT(FALSE);
}
#endif

#ifdef _DEBUG
_AfxTraceMsg(_T("PumpMessage"), &(pState->m_msgCur));
#endif

// process this message

if (pState->m_msgCur.message != WM_KICKIDLE && !AfxPreTranslateMessage(&(pState->m_msgCur)))
{
::TranslateMessage(&(pState->m_msgCur));
::DispatchMessage(&(pState->m_msgCur));
}
return TRUE; //程序停留在这里

}

我在Release模式下调试,该函数的线程调用会破坏我的程序中其他变量的地址

请问这种情况是为什么,该如何解决,谢谢
...全文
561 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gtbmx 2012-08-29
  • 打赏
  • 举报
回复
m_lId这个资源在主线程中我没用过,可能在动态链接库中有使用,我没法加互斥啊~
傻X 2012-08-28
  • 打赏
  • 举报
回复
Release模式下面,效率和执行速度比Debug高。(代码量,优化编译等问题造成)

看了楼主的代码,pObject->m_lId

感觉是资源没有互斥造成的

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧