在DOc的构造函数中得到VIew类指针引起的问题(GetActiveView()引起的Access Violation;this->GetFirstViewPosition()=NULL;ASSERT(AfxIsValidAddress(this, siz

本文分析了MFC单文档程序中线程调用VIEW类指针时遇到的问题及原因,并提供了有效的解决方案。介绍了正确的初始化顺序及线程调用VIEW的最佳实践。

原因分析:

DOC和VIEW的初始化顺序是先DOC 在VIEW,在DOC的构造函数调用GETVIEW是得不到POS的。

 

解决办法:

在想调用的时候在调用,而不是初始化的时候。

 

附注:MFC类文件的初始化先后顺序为:

app::InitInstance()   应用程序初始化,——>

doc构造函数初始化——>

CMainFrame::PreCreateWindow()初始化——>

View构造函数初始化——>

CMainFrame::OnCreate()   主程序框架创建 ——>

view::OnInitialUpdate()   视图初始化 ——>

view::OnDraw()   视图绘制

 

 


 

 

MFC单文档程序中线程调用view类指针应该注意的事项:

 

MFC单文档程序,我自已添加了Data.cpp Data.h。出错语句为Data.cpp中的

C/C++ code


   
//CWnd *pcwnd;
   
//pcwnd = ((CMainFrame*)AfxGetMainWnd())->GetActiveView(); //本来用这句,为找错分为两句
    CWnd *pmainfram;
    pmainfram
= AfxGetMainWnd(); //断点查看,这里正常获得
   
//(CView*)pcwnd->SendMessage(WM_MY_NEWCONNECT,0,0);
    CWnd *pview;
    pview
= ((CMainFrame*)pmainfram)->GetActiveView();//出错 unhandled


文件的包含情况是 文档和框架的CPP文件中都包含 Data.h Data.cpp中包含如下:

C/C++ code


#include
"stdafx.h"
#include
"Dream.h"
#include
"DreamDoc.h"
#include
"Data.h"
#include
"MainFrm.h"
#include
"DreamView.h"


程序编译没问题,但运行到GetActiveView();就出错。

 

 

 

 

解决办法:

        方法:在框架函数(开启新线程处)这样处理:

       

 

C/C++ code 
        m_dreamView
= GetActiveView();
        pcwinthread
= AfxBeginThread(ListeningThread,m_dreamView,0,0,0);

在新线程里: C/C++ code
        CDreamView
* pDreamView = (CDreamView *)lpvoid; //测试了下,似乎没什么问题
调试中出错,然后提示到这个地方:

C/C++ code
BOOL CObject::IsKindOf(
const CRuntimeClass* pClass) const
{
    ASSERT(
this != NULL);
   
// it better be in valid memory, at least for CObject size
    ASSERT(AfxIsValidAddress(this, sizeof(CObject)));

   
// simple SI case
    CRuntimeClass* pClassThis = GetRuntimeClass();//黄色箭头指向这句。。。。
    return pClassThis->IsDerivedFrom(pClass);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值