读书人

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

发布时间: 2012-05-05 17:21:10 作者: rapoo

关于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替换,来把界面刷新操作放到主线程中

读书人网 >C++

热点推荐