菜鸟感觉很棘手的内存报错,请大神帮忙

gwygw12 2014-05-05 06:49:12
我做了一个实时监控显示软件,为了实时我创建了一个线程,在这个线程中我用一个死循环不断地调用数据库。调用数据库我是调用一个子函数,这个子函数在OninitDialog 中调用不会报错,但是在线程中调用则显示内存错误,我刚刚接触MFC,感觉对这个错误很无力,希望大神帮助。

这个是我的线程函数,一个死循环,不断调用数据库。
UINT WINAPI DyncMonitorA()
{
CDataProcess dataA;
CChannelA datamemo;
while (1)
{
dataA.DataToArray_A(datamemo.DataMemo);
}
return 0;
}

这个是线程调用的函数
void CDataProcess::DataToArray_A(BOOL a[50][45])
{
HRESULT hr;
_variant_t RecordsAffected;
long tempslotnum;
int x,y; //存储对应对应时隙的方格所在矩阵的XY值;
/************************************************************************/
/* 连接数据集 */
/************************************************************************/
try
{
hr = m_pRecordset.CreateInstance(__uuidof(Recordset));
if (SUCCEEDED(hr))
{
// hr = m_pRecordset->Open("SELECT * FROM TEXT",
// theApp.m_pConnection.GetInterfacePtr(),
// adOpenDynamic,
// adLockOptimistic,
// adCmdText);
//////////////////////////////////////////////////////////////////////////
// 将A信道,TIMEOUT = 2,4,6;的数据取出(SLOTNUM,TIMEOUT,CHANNEL) //
//////////////////////////////////////////////////////////////////////////
m_pRecordset = theApp.m_pConnection->
Execute("SELECT SLOTNUM,TIMEOUT,CHANNEL FROM SLOT WHERE CHANNEL = 'A' AND(TIMEOUT = 2 OR TIMEOUT = 4 OR TIMEOUT = 6)",
&RecordsAffected,
adCmdText);
}
}
catch (_com_error &e)
{
AfxMessageBox(e.Description());
}
/************************************************************************/
/* 调用数据库信息处理 */
/************************************************************************/
try
{
while(!m_pRecordset->adoEOF)
{
tempslotnum = m_pRecordset->GetCollect("SLOTNUM");
x = GetGraphX(tempslotnum);
y = GetGraphY(tempslotnum);
a[x][y] = TRUE;
SendMessage(AfxGetMainWnd()->m_hWnd,WM_PAINT,0,0);

m_pRecordset->MoveNext();
}
return;
}
catch (_com_error &e)
{
AfxMessageBox(e.Description());
}
}

错误出在 while(!m_pRecordset->adoEOF)这一句中
以下是&e显示的错误信息,
[0] 0x004012c1 _com_error::`scalar deleting destructor'(unsigned int)
__vfptr CXX0030: Error: expression cannot be evaluated
CXX0030: Error: expression cannot be evaluated



如果这些代码看不出什么,我可以提供原文件。希望愿意帮我的大神留下邮箱。


...全文
228 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
enic 2014-05-07
  • 打赏
  • 举报
回复
AfxGetMainWnd()只能在主线程中用,因为只有主线程中有主窗口。 学习了,以前都不知道
gwygw12 2014-05-06
  • 打赏
  • 举报
回复
引用 3 楼 lis2012 的回复:
多线程里面的 对象参数 是需要传进去的,你是如何访问的?
我现在感觉是线程的问题,我把线程函数都注释掉后,内纯还是报错,但是不知道出现在那里
gwygw12 2014-05-05
  • 打赏
  • 举报
回复
引用 2 楼 lis2012 的回复:
theApp.m_pConnection 这个对象你是从哪里获取到的呢?
我在这个类class外声明的外部函数 extern CSlotMonitorTempletApp theApp;
class CSlotMonitorTempletApp : public CWinApp
{
public:
	_ConnectionPtr m_pConnection;
这个线程我没有传入函数。。。您的意思是 CDataProcess dataA; CChannelA datamemo;这两个参数是要用结构体传入么? 调用了void CDataProcess::DataToArray_A(BOOL a[50][45]),是不是还需要传入一些参数?我判断不好
lis2012 2014-05-05
  • 打赏
  • 举报
回复
多线程里面的 对象参数 是需要传进去的,你是如何访问的?
lis2012 2014-05-05
  • 打赏
  • 举报
回复
theApp.m_pConnection 这个对象你是从哪里获取到的呢?
gwygw12 2014-05-05
  • 打赏
  • 举报
回复
datamemo是一个BOOL型45*50的二维数组

15,472

社区成员

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

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