首先 祝大家中秋节快乐!提问: 小弟我现在面临一个问题,我在一个工程中处理一些数据比较庞大,等待时间比较长,现在想在处理数据的过程中 开辟一个新的线程,该线程显示一个对话框,对话框中加了一个CProgressCtrl控件来不断的显示滚动,等待数据处理完成后,对话框消失.请教如何实现?尽量详细些,多谢
解决方案 »
- VC开发中,全局变量的管理
- 端口号的设置问题
- VC Exce表导出和导入SQL 2000 ?
- menuitem 为什么不能变灰,不是popup
- 关于MPEG-4IP的分析
- 问个基础的问题,拆分窗体再加控件
- 两个很奇怪的内存泄露·附代码,请帮忙看看·我是新手,谢谢!
- 请教定时器的问题!高分 在线请教!!!
- 在COM+事务性组件中,如果在未调用GetObjectContext.SetComplete前结束调用,事务为什么竟然提交了,请指教,谢谢!!!
- 需要在给一个进程安装钩子后立即执行回调函数,需要用什么类型的钩子
- 怎么获得当前天的上一个星期的时间?上一个月的起点时间?
- 在webbrowser中如何截获将要POST出去的数据,如何拦截住该请求?
BOOL CImgExportThread::InitInstance()
{
// TODO: perform and per-thread initialization here m_bEnd = FALSE;
return TRUE;
}
int CImgExportThread::Run()
{
CExportXysFtDlg * pDlg = new CExportXysFtDlg();
pDlg->Create(IDD_DIALOG_EXPORT_XYSFT,NULL);
pDlg->ShowWindow(SW_SHOW); while (!m_bEnd)
{
pDlg->Run();
} pDlg->DestroyWindow();
delete pDlg;
return 1;// return CWinThread::Run();
}//进度条对话框BOOL CExportXysFtDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_progressCtrl.SetRange(0,100);
m_progressCtrl.SetStep(5);
m_progressCtrl.SetPos(0);
m_bRun = FALSE; return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}void CExportXysFtDlg::Run()
{ for (int i=0;i<20;i++)
{
m_progressCtrl.SetPos(i*5);
Sleep(100);
}}
//调用线程的主函数CImgExportThread* pTh = NULL;
BOOL CRasterViewDlg::ExportRasterLayer()
{ CString strFilters = "TIFF Files (*.tif)|*.tif||";
CFileDialog fDlg(FALSE,"","",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,strFilters);
if(fDlg.DoModal() != IDOK) return FALSE; CString strPath,strName,strFormat,strT;
strPath = fDlg.GetPathName();
strName = fDlg.GetFileName();
int n = strPath.ReverseFind('\\');
strPath = strPath.Left(n+1); pTh = (CImgExportThread*)::AfxBeginThread(RUNTIME_CLASS(CImgExportThread),
THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
pTh->ResumeThread();
Sleep(10000);//这里本是数据处理段,现我用10秒时间等待代替数据处理,而且我的数据处理时间不定
pTh->m_bEnd = TRUE;
AfxMessageBox("导出完成!");
return TRUE;
}
按照我现在的代码,实现不了,进度条对话框不能正常显示请大虾们赐教!
akirya(坏[其实偶不是什么所谓的坏人]) ( ) 信誉:97 2007-9-26 11:52:49 得分: 0
如果你要在线程内创建一个对话框的话,那么这个线程需要消息循环.
-----------------------------------------------------------------------------------
消息循环怎么搞?
THREAD_PRIORITY_NORMAL,this/*传递对话框指针*/, CREATE_SUSPENDED);int WINAPI ThreadProc(LPVOID pointer)
{
CRasterViewDlg* pDlg = (CRasterViewDlg*)pointer;//将接受到的LPVOID类型的指针强制类型转换
pDlg->m_progressCtrl.SetPos(xxxxx);
}
一般这种问题中线程中只是用来处理数据,对话框还是放在主线程中
---------------------------------------------------------------------------本来我也是这么做的,但是我的数据处理 调用的其他的组件实现的,在主线程处理才成功,放到线程里处理 失败,这个我测试过不行,才用现在这个方法,求教!
直接::AfxBeginThread(ThreadProc/*线程处理函数*/,
THREAD_PRIORITY_NORMAL,this/*传递对话框指针*/, CREATE_SUSPENDED);int WINAPI ThreadProc(LPVOID pointer)
{
CRasterViewDlg* pDlg = (CRasterViewDlg*)pointer;//将接受到的LPVOID类型的指针强制类型转换
pDlg->m_progressCtrl.SetPos(xxxxx);
}
____________________________________________________________________________________请问这个方法 怎么不断的刷新CProgressCtrl的进度,难道要不断的SetPos(xxxxx),那线程执行函数要不断的执行吗?
{
CRasterViewDlg* pDlg = (CRasterViewDlg*)pointer;//将接受到的LPVOID类型的指针强制类型转换 处理1
pDlg->m_progressCtrl.SetPos(xxxxx); 处理2
pDlg->m_progressCtrl.SetPos(xxxxx); 处理3
pDlg->m_progressCtrl.SetPos(xxxxx);}数据处理 取不到它的执行进度
----------------------------
那就要求修改你的数据处理组件接口,要求能返回正确的进度。
比如现在你的数据处理组件接口为一个函数接口 DealData();
那么它应该修改为 beginDealData()
while( !EndDealData() )
{
int nProgress = DealData();
pDlg->m_progressCtrl.SetPos( nProgress );
};