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

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

提问:

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

请教如何实现?尽量详细些,多谢
...全文
232 17 打赏 收藏 转发到动态 举报
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
  • 打赏
  • 举报
回复
我这个数据处理 取不到它的执行进度
所以我只能让进度条一直在滚动
  • 打赏
  • 举报
回复
如果你要在线程内创建一个对话框的话,那么这个线程需要消息循环.
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
  • 打赏
  • 举报
回复
不用开辟新的线程

使用非模式对话框显示进度。在处理数据过程中,自己估算处理时间和处理两定期的更新对话框的进度条。

15,473

社区成员

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

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