原因分析:
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);
}