请教一个线程内 对话框的问题,望大家解答? 谢谢! 祝中秋节快乐!

Jerry_Leo 2007-09-25 11:48:33
首先 祝大家中秋节快乐!

提问:

小弟我现在面临一个问题,我在一个工程中处理一些数据比较庞大,等待时间比较长,现在想在处理数据的过程中 开辟一个新的线程,该线程显示一个对话框,对话框中加了一个CProgressCtrl控件来不断的显示滚动,等待数据处理完成后,对话框消失.

请教如何实现?尽量详细些,多谢
...全文
227 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyg_zy 2007-09-27
  • 打赏
  • 举报
回复
int WINAPI ThreadProc(LPVOID pointer)
{
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 );
};



Jerry_Leo 2007-09-27
  • 打赏
  • 举报
回复
我这个数据处理 取不到它的执行进度
所以我只能让进度条一直在滚动
  • 打赏
  • 举报
回复
如果你要在线程内创建一个对话框的话,那么这个线程需要消息循环.
Jerry_Leo 2007-09-26
  • 打赏
  • 举报
回复
//线程
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;
}


按照我现在的代码,实现不了,进度条对话框不能正常显示

请大虾们赐教!
Chivalry 2007-09-26
  • 打赏
  • 举报
回复
根据你自己数据处理的进度来SetPos阿
ckt 2007-09-26
  • 打赏
  • 举报
回复
tl
Jerry_Leo 2007-09-26
  • 打赏
  • 举报
回复
有没有那个大哥 能给写个稍微详细点的例子代码 实现 我最上面说的功能
主线程 开辟 单独一个线程,对话框中的 进度条 一直在滚动

谢谢
Jerry_Leo 2007-09-26
  • 打赏
  • 举报
回复
To: jimoguilai() ( ) 信誉:100 2007-09-26 14:02:36 得分: 0


直接::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),那线程执行函数要不断的执行吗?
Jerry_Leo 2007-09-26
  • 打赏
  • 举报
回复
To: wltg2001(红猪) ( ) 信誉:100 2007-09-26 14:46:58 得分: 0


一般这种问题中线程中只是用来处理数据,对话框还是放在主线程中


---------------------------------------------------------------------------

本来我也是这么做的,但是我的数据处理 调用的其他的组件实现的,在主线程处理才成功,放到线程里处理 失败,这个我测试过不行,才用现在这个方法,求教!
wltg2001 2007-09-26
  • 打赏
  • 举报
回复
一般这种问题中线程中只是用来处理数据,对话框还是放在主线程中
allen0001 2007-09-26
  • 打赏
  • 举报
回复
经常用非模态对话框直接显示
Chivalry 2007-09-26
  • 打赏
  • 举报
回复
直接::AfxBeginThread(ThreadProc/*线程处理函数*/,
THREAD_PRIORITY_NORMAL,this/*传递对话框指针*/, CREATE_SUSPENDED);

int WINAPI ThreadProc(LPVOID pointer)
{
CRasterViewDlg* pDlg = (CRasterViewDlg*)pointer;//将接受到的LPVOID类型的指针强制类型转换
pDlg->m_progressCtrl.SetPos(xxxxx);
}
alfwolf 2007-09-26
  • 打赏
  • 举报
回复
其实开一个简单的工作线程,一种方法是将对话框的句柄作为参数传进线程,另一种方法就是向对话框发消息,消息的参数只要能表示进度就可以了.
Jerry_Leo 2007-09-26
  • 打赏
  • 举报
回复
To:
akirya(坏[其实偶不是什么所谓的坏人]) ( ) 信誉:97 2007-9-26 11:52:49 得分: 0



如果你要在线程内创建一个对话框的话,那么这个线程需要消息循环.


-----------------------------------------------------------------------------------
消息循环怎么搞?
ouyh12345 2007-09-25
  • 打赏
  • 举报
回复
不用新开对话框,向已有的对话框发消息,更新进度条
ckt 2007-09-25
  • 打赏
  • 举报
回复
对话框弄个接口更新进度条
线程收了数据,需要更新进度条就调用那个接口更新
线程技术,对话框关闭销毁
smaltdd 2007-09-25
  • 打赏
  • 举报
回复
不用开辟新的线程

使用非模式对话框显示进度。在处理数据过程中,自己估算处理时间和处理两定期的更新对话框的进度条。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧