首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

小弟我用AfxBeginThread起一线程,线程函数里需要view类指针,但是会内存泄漏或是断言异常

2012-01-21 
我用AfxBeginThread起一线程,线程函数里需要view类指针,但是会内存泄漏或是断言错误?我是一个MDI,对话框里

我用AfxBeginThread起一线程,线程函数里需要view类指针,但是会内存泄漏或是断言错误?
我是一个MDI,对话框里起一线程。在对话框类的主线程按下面获得view类指针,会有内存泄漏。在另起的线程里按下面获得view类指针,会有断言错误。
CMDIFrameWnd   *pMain=(CMDIFrameWnd   *)AfxGetApp()-> m_pMainWnd;//
CMDIChildWnd   *pChild=(CMDIChildWnd   *)pMain-> GetActiveFrame      
CMyView   *pView=(CMyView   *)pChild-> GetActiveView();
请教大侠帮忙!

[解决办法]
可以这样处理:
自定义一个消息,比如WM_USER_DRAW,
当需要进行绘制操作时,就像view发送该消息,用PostMessage或者SendMessage都可以。如果需要传递数据,就用全局变量或者用SendMessage.
大致的伪代码如下:

hWnd ; // 这是创建线程时通过参数传递过来的CMyView的句柄
...
// 定义并初始化绘制操作所需的数据,theData
::SendMessage( hWnd, WM_USER_DRAW, (WPARAM)&theData, (LPARAM)NULL);
///////////////////////////////////////////////
在CMyView中添加消息相应函数,在该函数进行实际的绘制操作
LRESULT CMyView::OnUserDraw( WPARAM wParam, LPARAMlParam )
{

...
return 0L;
}



[解决办法]
断言失败的原因为在调试模式会有你说的问题在
发布版本模式就没有mfc类库不推荐这么做,因为在cpu场景切换时可能丢失数据
如果你想做 把出现断言错误的地方不执行CFrameWnd::AssertValid()即可

[解决办法]

你在建立新线程的时候把要画的view指针传进线程
然后再线程里操作就可以了

热点排行