请教大虾关于bug:Access violation reading location

qianlizhima 2010-12-12 02:42:57
在Visual Studio 2008环境下,新建了一个MFC Application(基于SDI)的工程,名字为test1.主要任务:
通过在CTest1View类中增加一个CStatic控件,然后借助OpenCV(OpenCV1.0)来实现AVI格式视频的读取(XViD格式的AVI).在程
序中遇到这样的问题:如果让视频正常播放直到结束,点击框架窗口右上角的叉,程序正常关闭;但是如果视频还在播放就突然点击框架窗口右上角的叉,则会弹出模态对话框,提示这样的错误。
Unhandled exception at 0x05f398f4 in test1.exe: 0xC0000005: Access violation reading location 0x052d4e88。然后窗口显示一顿汇编指令。move ...啊?教教我把FC的新手。
下面我把自己的代码贴上来把。

一、在CTest1View.cpp中,
1.添加OpenCV的头文件
#include "cv.h"
#include "cvaux.h"
#include "cxcore.h"
#include "highgui.h"
2.新建结构体作为参数
typedef struct _PLAYVIDEO
{
HWND* hWnd;//播放视频的CStatic控件的窗口句柄
CString filename;//播放的文件名
}PLAYVIDEO;
PLAYVIDEO pv;//全局变量,可以在下面进行初始化并传递给播放视频的线程ThreadPlay;
3.声明用于播放的线程函数
DWORD WINAPI ThreadPlay(LPVOID lpParameter);
二、在CTest1View类中增加成员变量
protected:
CStatic m_staticVideo;
三、在CTest1View的OnCreate()中创建控件
if(!m_staticVideo.m_hWnd)
{
m_staticVideo.Create(_T(""),WS_CHILD | WS_VISIBLE,CRect(0,0,400,300),this);
}
else
{
m_staticVideo.ShowWindow(SW_SHOW);
}
四、在CTest1View中响应文件打开消息,添加如下代码:
CString szFilters("Avi Files(*.avi)|*.avi||");
CFileDialog dg(TRUE,_T("*.avi"),NULL,OFN_HIDEREADONLY,szFilters,this,0,1);
if(IDCANCEL==dg.DoModal())
{
return;
}

pv.filename=.GetFileName();
pv.hWnd=&(m_staticVideo.m_hWnd);

//创建线程
HANDLE h=CreateThread(NULL,0,ThreadPlay,&pv,CREATE_SUSPENDED,NULL);
SetThreadPriority(h,THREAD_PRIORITY_LOWEST);
ResumeThread(h);
五、然后是线程函数:
WORD WINAPI ThreadPlay(LPVOID lpParameter)
{
PLAYVIDEO *p=(PLAYVIDEO*)lpParameter;
HWND *pHwnd=p->hWnd;
CString strFilename=p->filename;

//将文件名由Unicode转为ASCII格式
char filename[1024];
memset(filename,0,1024);
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,strFilename,strFilename.GetLength(),filename,1024,NULL,NULL);

IplImage *pIplImage=NULL;
CvCapture *pCapture=NULL;
CvvImage cvvImage;

HDC hDC=::GetDC(*pHwnd);
CRect r(0,0,400,300);//CStatic控件的大小就是400*300

if(!(pCapture=cvCaptureFromFile(filename)))
{
AfxMessageBox(_T("Open failed"),MB_OK);
return 0;
}
while(pIplImage=cvQueryFrame(pCapture))
{
cvvImage.CopyOf(pIplImage);
cvvImage.DrawToHDC(hDC,&r);
cvWaitKey(20);
}
if(pCapture)
cvReleaseCapture(&pCapture);
if(pIplImage)
cvReleaseImage(&pIplImage);
ReleaseDC(*pHwnd,hDC);
return 0;
}

请问怎么办啊?
...全文
1608 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2010-12-12
  • 打赏
  • 举报
回复
while(!IsToQuit && (pIplImage=cvQueryFrame(pCapture)))
中途退出时:
if(pIplImage)
cvReleaseImage(&pIplImage);
pIplImage可能是野指针
qianlizhima 2010-12-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 schlafenhamster 的回复:]
这是中途退出,是不是清理工作没做好?
[/Quote]
那什么地方需要清理呢?我真不明白了。
schlafenhamster 2010-12-12
  • 打赏
  • 举报
回复
这是中途退出,是不是清理工作没做好?
qianlizhima 2010-12-12
  • 打赏
  • 举报
回复
这样虽然可以通过创建CMutex的对象来控制对IsToQuit的访问,但是还是存在原先的问题?
为什么存在某个内存控件(memory location)不能访问?你们有遇到这样的问题吗?
qianlizhima 2010-12-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 schlafenhamster 的回复:]
可不可以在:
while(pIplImage=cvQueryFrame(pCapture))
{
cvvImage.CopyOf(pIplImage);
cvvImage.DrawToHDC(hDC,&r);
//主程序close时发个消息过来,如果要求退出就break。
cvWaitKey(20);//它能检测close吗?
}
[/Quote]

我可以在框架窗口类CMainFrame中添加一个OnClose()对WM_CLOSE进行响应,
1.在MainFrm.h中
#define WM_PRECLOSE WM_USER+1
2.在框架窗口的OnClose()中
/*窗口关闭之前发送消息给CTest1View类*/
SendMessage(GetWindow(GW_CHILD)->GetSafeHwnd(),WM_PRECLOSE,NULL,NULL);
3.在CTest1View.h中
#include "MainFrm.h"
并添加消息响应函数
OnPreClose()
4.在CVTest1View.cpp中添加一个播放标志
全局变量
BOOL IsToQuit=FALSE;
5.在该函数OnPreClose()中,设置
IsToQuit=TRUE;
6.线程的while循环由原先的
while(pIplImage=cvQueryFrame(pCapture))
{
cvvImage.CopyOf(pIplImage);
cvvImage.DrawToHDC(hDC,&r);
cvWaitKey(20);
}
修改为:
while(!IsToQuit && (pIplImage=cvQueryFrame(pCapture)))
{
cvvImage.CopyOf(pIplImage);
cvvImage.DrawToHDC(hDC,&r);
cvWaitKey(20);
}
但是这样会报错的。
因为全局变量IsToQuit是主线程和子线程(播放线程)共享的资源,没有有效管理是会出错的。谢谢schlafenhamster
yihandrensunyong 2010-12-12
  • 打赏
  • 举报
回复
帮顶 帮顶
schlafenhamster 2010-12-12
  • 打赏
  • 举报
回复
可不可以在:
while(pIplImage=cvQueryFrame(pCapture))
{
cvvImage.CopyOf(pIplImage);
cvvImage.DrawToHDC(hDC,&r);
//主程序close时发个消息过来,如果要求退出就break。
cvWaitKey(20);//它能检测close吗?
}

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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