为什么我的程序进入线程之后,运行一下就提示有内存错误呢?

neu_2015 2017-04-19 07:38:33
1.下面是我的线程处理程序:
UINT ReadThreadLoop( LPVOID params ) {		//线程处理
bool okin; //bool表示布尔型数据
CSJCJVCDlg *dlg = (CSJCJVCDlg *) params;
OVERLAPPED inOvLap; //OVERLAPPED:你需要操作系统传递一批数据,于是填了一个overlapped的订单,订单上写着从哪里(数据的偏移位置)开始传输,
//于是你去干别的事去了。系统完成传输就打个电话(激活hEvent)叫你验收,你看到overlapped订单上系统写着的传输的数据数量验收接收的数据。
//另一种解释:OVERLAPPED I/O是WIN32的一项技术, 你可以要求操作系统为你传送数据,并且在传送完毕时通知你。
//这项技术使你的程序在I/O进行过程中仍然能够继续处理事务。事实上,操作系统内部正是以线程来I/O完成OVERLAPPED I/O。你可以获得线程的所有利益,而不需付出什么痛苦的代价。也就是说,OVERLAPPED主要是设置异步I/O操作,异步I/O操作是指应用程序可以在后台读或者写数据,而在前台做其他事情。
PUCHAR inData = new UCHAR[512]; //建立一个字符数据缓冲区,大小为512个字节。PUCHAR: 指向一个Windows字符的指针;UCHAR:无符号Windows字符
ZeroMemory(inData,512); //ZeroMemory用0填充一片内存,第一个参数是起始地址,第二个参数是长度
inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
dlg->InEndpt->TimeOut = 0;//运行到这里出现错误 //TimeOut表示传输等待时间

for (;dlg->ReadThreadLooping ;) //循环
{
LONG inlen=512;
//异步读数据
UCHAR *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap);
dlg->InEndpt->WaitForXfer(&inOvLap,200);
okin = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext);
if (okin) //如果读取成功,则保存数据
{
mFile.SeekToEnd();
mFile.Write(inData,inlen);
}
}
//结束Start
ept->Target = TGT_DEVICE;
ept->ReqType = REQ_VENDOR;
ept->Direction = DIR_TO_DEVICE;
ept->ReqCode = 0xAB; //请求码
ept->Value = 0;
ept->Index = 0;

PUCHAR buf=new UCHAR[2];
ZeroMemory(buf, 2);
LONG buflen = 2;
buf[0]=0xAB;
buf[1]=0x00; //结束Start
ept->XferData(buf,buflen);

CloseHandle(inOvLap.hEvent);

delete []buf;
buf = NULL;
delete [] inData;
inData = NULL;

dlg->ReadThread = NULL; //线程结束

dlg->USBDevice->Close(); //关闭USB设备

mFile.Flush(); //关闭文件
mFile.Close();

return true;
}



2.代码运行到
dlg->InEndpt->TimeOut = 0;	//运行到这里出现错误


错误信息是:


3.然后调用堆栈会提示这里有问题:
if (pThread->m_pfnThreadProc != NULL)
{
nResult = (*pThread->m_pfnThreadProc)(pThread->m_pThreadParams);
ASSERT_VALID(pThread);
}
...全文
314 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36634306 2017-04-20
  • 打赏
  • 举报
回复
那你别定义成指针类型。 CCyUSBEndPoint InEndpt; InEndpt->都换成InEndpt.
neu_2015 2017-04-20
  • 打赏
  • 举报
回复
引用 13 楼 qq_36634306 的回复:
InEndpt指针在线程的上面,您可以看看我之前发布的程序,里面有的,是这样的。 所以InEndpt定义的是全局变量?那就把dlg->去掉。 或者把InEndpt的定义成dlg的成员变量。
去掉dlg->也不行,问题现在就出现在InEndpt指针上面,好像没有初始化,但是不知道怎么把他初始化,好纠结
qq_36634306 2017-04-20
  • 打赏
  • 举报
回复
InEndpt指针在线程的上面,您可以看看我之前发布的程序,里面有的,是这样的。 所以InEndpt定义的是全局变量?那就把dlg->去掉。 或者把InEndpt的定义成dlg的成员变量。
neu_2015 2017-04-20
  • 打赏
  • 举报
回复
引用 8 楼 baijiaheizhiganmao 的回复:
CSJCJVCDlg *dlg = (CSJCJVCDlg *) params; 这一句后面判断一下dlg是否为NULL.假如为NULL,很显然会发生此类错误.
我添加判断了,dlg这个指针不为空的
neu_2015 2017-04-20
  • 打赏
  • 举报
回复
引用 10 楼 qq_36634306 的回复:
显示的什么错误?CyUSBEndPoint *InEndpt; 定义是在哪里定义的?
[quote=引用 9 楼 u010820251 的回复:]
[quote=引用 7 楼 qq_36634306 的回复:]
dlg->InEndpt,InEndpt 应该是一个自定义类型的结构体,你没有给他分配内存空间,你需要在创建对话框时或者dlg对象创建时候给他分配内存。

InEndpt=new inEndpt的类型.

inEndpt的类型就是你结构体的名称。
推出的时候delete就行


[quote=引用 6 楼 u010820251 的回复:]
[quote=引用 5 楼 qq_36634306 的回复:]
昨天刚碰到类似的问题。
InEndpt这个结构体没有分配空间。
dlg的构造函数加上inEndpt=new inEndpt
界面退出加上delete inEndpt
不是很明白您的意思,您能说的再具体一点吗,原谅我是一个小白[/quote][/quote]
C

CyUSBEndPoint *InEndpt; //这个是InEndpt的定义

UINT ReadThreadLoop( LPVOID params ) { //线程处理
bool okin;
CSJCJVCDlg *dlg = (CSJCJVCDlg *) params;
OVERLAPPED inOvLap;

PUCHAR inData = new UCHAR[512];
ZeroMemory(inData,512); //ZeroMemory用0填充一片内存,第一个参数是起始地址,第二个参数是长度
inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
dlg->InEndpt->TimeOut = 0; //运行到这里出现错误 这里是第一次使用InEndpt



我的InEndpt这个指针的定义是[code=c]CCyUSBEndPoint *InEndpt;

按照您说的,是这样添加吗
InEndpt = new CCyUSBEndPoint;

这样显示是错误的,还是我没有理解您的意思呢[/quote][/quote]InEndpt指针在线程的上面,您可以看看我之前发布的程序,里面有的,是这样的:
CCyUSBEndPoint *InEndpt;

按照您说的需要添加空间,我这样添加了一行程序:
InEndpt = new CCyUSBEndPoint;

提示这样的错误:
qq_36634306 2017-04-20
  • 打赏
  • 举报
回复
显示的什么错误?CyUSBEndPoint *InEndpt; 定义是在哪里定义的?
引用 9 楼 u010820251 的回复:
[quote=引用 7 楼 qq_36634306 的回复:] dlg->InEndpt,InEndpt 应该是一个自定义类型的结构体,你没有给他分配内存空间,你需要在创建对话框时或者dlg对象创建时候给他分配内存。 InEndpt=new inEndpt的类型. inEndpt的类型就是你结构体的名称。 推出的时候delete就行 [quote=引用 6 楼 u010820251 的回复:] [quote=引用 5 楼 qq_36634306 的回复:] 昨天刚碰到类似的问题。 InEndpt这个结构体没有分配空间。 dlg的构造函数加上inEndpt=new inEndpt 界面退出加上delete inEndpt
不是很明白您的意思,您能说的再具体一点吗,原谅我是一个小白[/quote][/quote]
C

CyUSBEndPoint *InEndpt;     //这个是InEndpt的定义

UINT ReadThreadLoop( LPVOID params ) {		//线程处理
	bool okin;								
        CSJCJVCDlg *dlg = (CSJCJVCDlg *) params;
	OVERLAPPED inOvLap;						
																												
	PUCHAR inData = new UCHAR[512];			
	ZeroMemory(inData,512);					//ZeroMemory用0填充一片内存,第一个参数是起始地址,第二个参数是长度
	inOvLap.hEvent   = CreateEvent(NULL, false, false, "CYUSB_IN"); 
	dlg->InEndpt->TimeOut = 0;	//运行到这里出现错误		这里是第一次使用InEndpt	



我的InEndpt这个指针的定义是[code=c]CCyUSBEndPoint *InEndpt;
按照您说的,是这样添加吗
InEndpt = new CCyUSBEndPoint;
这样显示是错误的,还是我没有理解您的意思呢[/quote]
neu_2015 2017-04-20
  • 打赏
  • 举报
回复
引用 7 楼 qq_36634306 的回复:
dlg->InEndpt,InEndpt 应该是一个自定义类型的结构体,你没有给他分配内存空间,你需要在创建对话框时或者dlg对象创建时候给他分配内存。 InEndpt=new inEndpt的类型. inEndpt的类型就是你结构体的名称。 推出的时候delete就行 [quote=引用 6 楼 u010820251 的回复:] [quote=引用 5 楼 qq_36634306 的回复:] 昨天刚碰到类似的问题。 InEndpt这个结构体没有分配空间。 dlg的构造函数加上inEndpt=new inEndpt 界面退出加上delete inEndpt
不是很明白您的意思,您能说的再具体一点吗,原谅我是一个小白[/quote][/quote]
C

CyUSBEndPoint *InEndpt;     //这个是InEndpt的定义

UINT ReadThreadLoop( LPVOID params ) {		//线程处理
	bool okin;								
        CSJCJVCDlg *dlg = (CSJCJVCDlg *) params;
	OVERLAPPED inOvLap;						
																												
	PUCHAR inData = new UCHAR[512];			
	ZeroMemory(inData,512);					//ZeroMemory用0填充一片内存,第一个参数是起始地址,第二个参数是长度
	inOvLap.hEvent   = CreateEvent(NULL, false, false, "CYUSB_IN"); 
	dlg->InEndpt->TimeOut = 0;	//运行到这里出现错误		这里是第一次使用InEndpt	



我的InEndpt这个指针的定义是[code=c]CCyUSBEndPoint *InEndpt;
按照您说的,是这样添加吗
InEndpt = new CCyUSBEndPoint;
这样显示是错误的,还是我没有理解您的意思呢
忘世麒麟 2017-04-20
  • 打赏
  • 举报
回复
CSJCJVCDlg *dlg = (CSJCJVCDlg *) params; 这一句后面判断一下dlg是否为NULL.假如为NULL,很显然会发生此类错误.
qq_36634306 2017-04-20
  • 打赏
  • 举报
回复
dlg->InEndpt,InEndpt 应该是一个自定义类型的结构体,你没有给他分配内存空间,你需要在创建对话框时或者dlg对象创建时候给他分配内存。 InEndpt=new inEndpt的类型. inEndpt的类型就是你结构体的名称。 推出的时候delete就行
引用 6 楼 u010820251 的回复:
[quote=引用 5 楼 qq_36634306 的回复:] 昨天刚碰到类似的问题。 InEndpt这个结构体没有分配空间。 dlg的构造函数加上inEndpt=new inEndpt 界面退出加上delete inEndpt
不是很明白您的意思,您能说的再具体一点吗,原谅我是一个小白[/quote]
neu_2015 2017-04-20
  • 打赏
  • 举报
回复
引用 5 楼 qq_36634306 的回复:
昨天刚碰到类似的问题。 InEndpt这个结构体没有分配空间。 dlg的构造函数加上inEndpt=new inEndpt 界面退出加上delete inEndpt
不是很明白您的意思,您能说的再具体一点吗,原谅我是一个小白
qq_36634306 2017-04-20
  • 打赏
  • 举报
回复
昨天刚碰到类似的问题。 InEndpt这个结构体没有分配空间。 dlg的构造函数加上inEndpt=new inEndpt 界面退出加上delete inEndpt
neu_2015 2017-04-20
  • 打赏
  • 举报
回复
引用 15 楼 qq_36634306 的回复:
那你别定义成指针类型。 CCyUSBEndPoint InEndpt; InEndpt->都换成InEndpt.
引用 15 楼 qq_36634306 的回复:
那你别定义成指针类型。 CCyUSBEndPoint InEndpt; InEndpt->都换成InEndpt.
找到问题了,就是指针InEndpt,只定义了,并没有初始化,初始化一下给个地址就好了,多谢您的耐心解答
neu_2015 2017-04-19
  • 打赏
  • 举报
回复
引用 3 楼 GKatHere 的回复:
查看dlg->InEndpt是否正确初始化
怎么查看呢,而且这个InEndpt,定义过之后,这里是第一次使用,好像没有初始化过
GKatHere 2017-04-19
  • 打赏
  • 举报
回复
查看dlg->InEndpt是否正确初始化
neu_2015 2017-04-19
  • 打赏
  • 举报
回复
在调试过程中,监控InEndpt指针时,提示无法读取内存,这是怎么回事啊
neu_2015 2017-04-19
  • 打赏
  • 举报
回复
有没有人遇到这样的情况,希望能指点一下,困惑好几天了,一点思路都没有

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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