社区
进程/线程/DLL
帖子详情
请教一个线程内 对话框的问题,望大家解答? 谢谢! 祝中秋节快乐!
Jerry_Leo
2007-09-25 11:48:33
首先 祝大家中秋节快乐!
提问:
小弟我现在面临一个问题,我在一个工程中处理一些数据比较庞大,等待时间比较长,现在想在处理数据的过程中 开辟一个新的线程,该线程显示一个对话框,对话框中加了一个CProgressCtrl控件来不断的显示滚动,等待数据处理完成后,对话框消失.
请教如何实现?尽量详细些,多谢
...全文
232
17
打赏
收藏
请教一个线程内 对话框的问题,望大家解答? 谢谢! 祝中秋节快乐!
首先 祝大家中秋节快乐! 提问: 小弟我现在面临一个问题,我在一个工程中处理一些数据比较庞大,等待时间比较长,现在想在处理数据的过程中 开辟一个新的线程,该线程显示一个对话框,对话框中加了一个CProgressCtrl控件来不断的显示滚动,等待数据处理完成后,对话框消失. 请教如何实现?尽量详细些,多谢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
我这个数据处理 取不到它的执行进度
所以我只能让进度条一直在滚动
珍惜生命远离CPP
2007-09-26
打赏
举报
回复
如果你要在线程内创建一个对话框的话,那么这个线程需要消息循环.
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
打赏
举报
回复
不用开辟新的线程
使用非模式对话框显示进度。在处理数据过程中,自己估算处理时间和处理两定期的更新对话框的进度条。
C#操作摄像头
本文将深入探讨如何使用C#来操作摄像头,基于提供的标题和描述,我们可以了解到这是
一个
关于利用C#进行摄像头编程的实际应用案例。 首先,要操作摄像头,我们需要引入相应的库。在.NET Framework或.NET Core中,...
198个经典C_WinForm实例源码(超赞)
在IT行业中,Windows Forms(WinForms)是.NET框架下的
一个
用户界面(UI)开发平台,主要用于构建桌面应用程序。C#是Microsoft开发的一种面向对象的编程语言,与WinForms结合使用,能够创建功能丰富的、交互性强的...
阿里巴巴面试总结DOC版
* 类加载器结构如何,如何在
一个
bundle 中加载另外
一个
bundle 中的
一个
类? Spring 框架 * Spring AOP 用了什么设计原则,自动注入配置是做什么用的? * Spring 框架如何不需要配置文件加载 bean 定义,可能是问...
类似QQ的全套聊天系统[极品] 源码
【标题】:“类似QQ的全套聊天系统[极品] 源码”指的是
一个
基于.NET框架开发的、模仿QQ功能的完整聊天系统源代码。这个源码可能是为了教学、研究或者二次开发的目的而提供的,旨在帮助开发者理解即时通讯(IM)系统...
DirectX修复工具 V3.3标准 绿色版
同时鉴于Windows 8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中默认未包含.NET Framework 2.0,因此新版的程序文件夹内将包含
一个
DirectX_Repair_win8的特别版程序,该程序功能与通用版相同,基于.NET ...
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章