急ing,在工作者线程中更换主线程中控件显示的图形报错,在线等... 界面上有个进度条,所以开了线程做读写文件的操作还有个控件,可载入所生成的图形文件函数是SetSrc(),参数是文件名现在在工作者线程中进行读写一切正常,但是想让控件显示出所生成的图形就报错项目急,各位高人出出主意啊!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 UINT ProgressThread(LPVOID pParam){ CMinDistanceDlg* pDialog = (CMinDistanceDlg*) pParam; switch(eNextTask) { case OPEN_FILE: pDialog->m_solid.InitSolid(pDialog->m_sFile); break; case EXPERT_TO_DXF: pDialog->m_solid.expertToDXF(strTempDXFFile); break; case LOAD_DXF_FILE: pDialog->m_avviewx.SetSrc(strTempDXFFile);//报错 break; } eNextTask = (Task) ((eNextTask + 1) % 3); return 0;}void CMinDistanceDlg::OnBtnOpenFile() { // TODO: Add your control notification handler code here char szFilters[] = "NFF Files(*.nff);OFF Files(*.off)|*.nff;*.Off||"; CFileDialog m_LoadFile(TRUE,"","",OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,szFilters,this); if(m_LoadFile.DoModal() == IDOK) { m_sFile = m_LoadFile.GetPathName(); SetWindowText("minDistance -[" + m_sFile + "]"); m_sProgressInfo = "Opening file ..."; m_sOpenTime = ""; UpdateData(FALSE); SYSTEMTIME tOpenBegin; SYSTEMTIME tOpenEnd; GetSystemTime(&tOpenBegin); DoTaskInNewThread(); GetSystemTime(&tOpenEnd); m_sOpenTime.Format("%f milliseconds", ::getTimeUsed(tOpenBegin, tOpenEnd)); UpdateData(FALSE); m_sProgressInfo = "Creating DXF file ..."; UpdateData(FALSE); DoTaskInNewThread(); m_sProgressInfo = "Loading DXF file ..."; UpdateData(FALSE); DoTaskInNewThread(); m_sProgressInfo = "Done"; UpdateData(FALSE); m_progress.SetPos(0); }}void CMinDistanceDlg::DoTaskInNewThread(){ CWinThread *m_pThread; m_pThread = AfxBeginThread(ProgressThread, (LPVOID) this,THREAD_PRIORITY_NORMAL, 0, 0, NULL); m_progress.SetPos(0); Task eCurrentTask = eNextTask; while(eNextTask == eCurrentTask) { m_progress.StepIt(); Sleep(150); } m_progress.SetPos(100);} 试试不要 pDialog->m_avviewx.SetSrc(strTempDXFFile);//报错而是向这个对话框PostMessage一个自定义消息,在你的对话框中实现对自定义消息的处理 我的控件已经放在CMinDistanceDlg上了,如果把m_avviewx.SetSrc(strTempDXFFile);放在CMinDistanceDlg::OnBtnOpenFile()里就能正常执行,但是进度条不跑,现在放到工作者线程里,进度条可以正常跑,但是就这个函数报错我该怎么办啊,急 pDialog->PostMessage(你的自定义消息)?我没说明白? pDialog->PostMessage,这样子一样会有问题,而应该将pDialog->GetSafeHwnd()传给工作者线程,工作者线程应该通过PostMessage(hwndDialog......); 这是因为CWnd::FromHandle用到了一个与线程本地存储有关的MAP(MFC干的), TO:barsteng(barsteng)假设我定义了一个消息,也用PostMessage传过去啦,那我处理这个消息的函数将完成m_avviewx.SetSrc(strTempDXFFile);但是我把让进度条在m_avviewx装载文件时滚动的功能放在哪呢,如果也放在接收消息的函数里肯定是要等到装载完了才能执行啊 怎么hook指定的对话框 RegOpenKeyEx 读取注册表的问题 求助,从VC6.0转到.net的,问几个问题。 大家帮忙推荐一下新手学VC++的书呀. 加载 DLL 的问题 如何通过 文件名 来得到它执行后的 窗口名 和 进程标识 ? ATL开发的activex为什么只有在IE6.0的机子上才能使用? 多视图:一共三行,但中间一行分为两列,请问如何实现。 内存读写错误?? 用ATL编程时能用MFC的类吗?那怎么用呢? 问几个关于textout、createfont、setbkmode函数相关的问题……,在线等,急 关于一窗口多视图的问题
{
CMinDistanceDlg* pDialog = (CMinDistanceDlg*) pParam; switch(eNextTask)
{
case OPEN_FILE:
pDialog->m_solid.InitSolid(pDialog->m_sFile);
break;
case EXPERT_TO_DXF:
pDialog->m_solid.expertToDXF(strTempDXFFile);
break;
case LOAD_DXF_FILE:
pDialog->m_avviewx.SetSrc(strTempDXFFile);//报错
break;
} eNextTask = (Task) ((eNextTask + 1) % 3);
return 0;
}void CMinDistanceDlg::OnBtnOpenFile()
{
// TODO: Add your control notification handler code here
char szFilters[] = "NFF Files(*.nff);OFF Files(*.off)|*.nff;*.Off||";
CFileDialog m_LoadFile(TRUE,"","",OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,szFilters,this);
if(m_LoadFile.DoModal() == IDOK)
{
m_sFile = m_LoadFile.GetPathName();
SetWindowText("minDistance -[" + m_sFile + "]");
m_sProgressInfo = "Opening file ...";
m_sOpenTime = "";
UpdateData(FALSE);
SYSTEMTIME tOpenBegin;
SYSTEMTIME tOpenEnd;
GetSystemTime(&tOpenBegin);
DoTaskInNewThread();
GetSystemTime(&tOpenEnd);
m_sOpenTime.Format("%f milliseconds", ::getTimeUsed(tOpenBegin, tOpenEnd));
UpdateData(FALSE);
m_sProgressInfo = "Creating DXF file ...";
UpdateData(FALSE);
DoTaskInNewThread(); m_sProgressInfo = "Loading DXF file ...";
UpdateData(FALSE);
DoTaskInNewThread(); m_sProgressInfo = "Done";
UpdateData(FALSE);
m_progress.SetPos(0);
}
}void CMinDistanceDlg::DoTaskInNewThread()
{
CWinThread *m_pThread;
m_pThread = AfxBeginThread(ProgressThread, (LPVOID) this,THREAD_PRIORITY_NORMAL, 0, 0, NULL); m_progress.SetPos(0);
Task eCurrentTask = eNextTask;
while(eNextTask == eCurrentTask)
{
m_progress.StepIt();
Sleep(150);
}
m_progress.SetPos(100);
}
而是向这个对话框PostMessage一个自定义消息,在你的对话框中实现对自定义消息的处理
m_avviewx.SetSrc(strTempDXFFile);
放在CMinDistanceDlg::OnBtnOpenFile()里就能正常执行,但是进度条不跑,
现在放到工作者线程里,进度条可以正常跑,但是就这个函数报错
我该怎么办啊,急
?我没说明白?
假设我定义了一个消息,也用PostMessage传过去啦,
那我处理这个消息的函数将完成
m_avviewx.SetSrc(strTempDXFFile);
但是我把让进度条在m_avviewx装载文件时滚动的功能放在哪呢,如果也放在接收消息的函数里肯定是要等到装载完了才能执行啊