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

关于MFC中多线程用来处理后台计算的有关问题

2012-05-05 
关于MFC中多线程用来处理后台计算的问题struct threadInfo{void func()}void threadInfo::func(){CMainF

关于MFC中多线程用来处理后台计算的问题
struct threadInfo
{
void func();
};

void threadInfo::func()
{
CMainFrame* pFrame=(CMainFrame*)AfxGetMainWnd();
CSASEDoc* pDoc=(CSASEDoc*)pFrame->GetActiveDocument();
pDoc->m_sData.Empty();
pDoc->m_glEle.StaticAnalysis();
}

UINT CSASEDoc::MyThreadProc( LPVOID lpParam )
{
threadInfo* pInfo=(threadInfo*)lpParam;
pInfo->func();

return 0;
}

void CSASEDoc::OnAnalysisLoading() 
{
// TODO: Add your command handler code here
CString str;
str.Format("正在进行计算");
CMainFrame* frm = (CMainFrame*) AfxGetMainWnd();
ASSERT(frm);
frm->m_OutputDockBar.RemoveAllMessageLines();
frm->m_OutputDockBar.AddMessageLine(str);

CTime ts,te;
CTimeSpan tspan;
CString sBuf;
ts=CTime::GetCurrentTime();

threadInfo info;

pThread=AfxBeginThread(MyThreadProc,&info,0,0,0,NULL);

  te=CTime::GetCurrentTime();
tspan=te-ts;
sBuf.Format("计算用时: %d 秒。",tspan.GetTotalSeconds());
AfxMessageBox(sBuf);
UpdateAllViews(NULL);

}

颜色标出来的2处就是我需要后台进行计算的2个函数,整个下来,编译什么的都通过了就是进程序后点击计算会出现XXX.exe中的 0x787a360a (mfc90d.dll) 处未处理的异常: 0xC0000005: 读取位置 0xcccccd64 时发生访问冲突,帧堆栈说是mfc90d.dll!AfxGetAmbientActCtx()。这2个计算的函数肯定没问题,因为之前不用多线程的时候调用是没有问题的

[解决办法]
为什么不直接传函数的地址,把类的指针当做参数传进去?
[解决办法]
工作线程不好直接调用MFC的内容
[解决办法]
数据和界面要分离 MFC的控件都不是线程安全的 你直接在工作线程中刷新界面必然容易出问题
UpdateAllViews(NULL);
这一步用SendMessage替换,来把界面刷新操作放到主线程中

热点排行