CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

怎么我的进度条运行时,而我的程序相关函数并没有运行?进度条完了,程序才接着运行!怎么不同步?

楼主gxning(gxning)2006-06-02 21:27:31 在 VC/MFC / 基础类 提问

void   CScoreDlg::OnButton4()    
  {  
   
  CSHProgressWnd   dlg;  
  const   DWORD         dwMax   =   1500;  
  TCHAR                     szMsg[256];  
  HRESULT                 hr;  
   
          UpdateData();  
   
          if   (   !dlg.IsValid()   )  
                  {  
                  AfxMessageBox   (   _T("Couldn't   create   CSHProgressWnd   object.     CSHProgressWnd   requires   IE   5   to   be   installed."),   MB_ICONERROR   );  
                  return;  
                  }  
   
          dlg.SetTitle   (   _T("Progress   Dlg   Title")   );  
          dlg.SetAnimation   (   IDR_PROGRESS   );  
          dlg.SetCancelMessage   (   _T("Cancel   Message")   );  
          dlg.SetLineText   (   1,   _T("Unzipping   some   phantom   files...")   );  
   
          //dlg.SetAllowMinimize   (   m_bShowMinimize   );  
          //dlg.SetCalculateTime   (   m_bShowTimeLeft   );  
          //dlg.SetShowProgressBar   (   m_bShowProgressBar   );  
   
          hr   =   m_bModalDlg   ?   dlg.ShowModal(this)   :   dlg.ShowModeless(this);  
   
          if   (   FAILED(hr)   )  
                  {  
                  CString   s;  
   
                  s.Format   (   _T("Couldn't   show   the   progress   window.     Error   returned   was   %lu"),  
                                      (DWORD)   hr   );  
   
                  AfxMessageBox   (   s,   MB_ICONERROR   );  
                   
                  return;  
                  }  
   
          dlg.UpdateProgress   (   0,   dwMax   );  
          dlg.ResetTimer();  
   
          for   (   DWORD   dw   =   0;  
                      dw   <   dwMax     &&     !dlg.HasUserCanceled();  
                      dw   +=   8   +   rand()%10   )  
                  {  
                  Sleep(150);  
   
                  if   (   dw   >   dwMax   )  
                          dw   =   dwMax;                                   //   just   in   case   we   go   over   the   max   value  
   
                  wsprintf   (   szMsg,   _T("Progress   =   %lu/%lu"),   dw,   dwMax   );  
   
                  dlg.SetLineText   (   2,   szMsg   );  
                  dlg.UpdateProgress   (   dw   );  
                  }  
   
  }  
  这是我的进度条函数  
   
   
   
  问题点数:20、回复次数:9Top

1 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-02 22:06:14 得分 0

考虑多线程。  
   
  一般来讲使用进度条都要用多线程的Top

2 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-02 22:15:34 得分 0

原因:Windows是消息机而不是数据机  
   
  一切事件来自于消息,而消息是一个队列,每个线程只能有一个消息对列,一个窗口只能有一个线程与之对应。在你的函数开始处理之前,一定是窗口触发了某个消息。当然,你的函数在运行时这个消息也就不可能被返回,直到你的函数结束。此时整个窗口都被“挂起”来等候你函数的返回,当然也就不可能更新了。如果你在函数中对界面有任何操作的话,都将无效。Top

3 楼dzq138(钟添)回复于 2006-06-02 22:33:08 得分 10

举一个用多线程的例子:  
   
  h文件中声明线程:  
  static   DWORD   WINAPI   AccountThreadProc(LPVOID   lpParameter);   //必须声明为静态的线程函数.当然如果是全局的则没这个必要  
   
  cpp文件中:  
  DWORD   WINAPI   CScoreDlg::AccountThreadProc(LPVOID   lpParameter)  
  {  
  CScoreDlg*   pCScoreDlg=(CScoreDlg*)lpParameter;  
  CProgressCtrl   *m_cpro=(CProgressCtrl*)pCScoreDlg->GetDlgItem(IDC_PROGRESS1);   //进度条  
  int   i=0;  
  while   (i<100)//....处理循环长时间的工作.  
  {  
        i++;  
        m_cpro->SetPos(i);     //设置时度条.  
  }  
  }  
   
  //调用  
  CreateThread(0,0,CScoreDlg::AccountThreadProc,(LPVOID)this   ,0,&m_dwAccountThreadId);//创建线程,并开始工作  
   
  另:进度条的开销挺大的,SetPos(值)时尽量控制在一百次的调用.要不慢得要死!Top

4 楼gxning(gxning)回复于 2006-06-03 00:28:18 得分 0

我要新开一个窗口,进度条完了之后,就destory   itTop

5 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-03 01:00:15 得分 0

提醒一下gxning,问问题最好还是说的清楚一点,别让大家来猜你是什么意思Top

6 楼gxning(gxning)回复于 2006-06-03 01:05:55 得分 0

sorry,我刚学,知道得不多,有时辞不达意,请大家原谅Top

7 楼gxning(gxning)回复于 2006-06-03 01:11:36 得分 0

我的目的,是要求我在数据处理时,弹出一个有进度条的窗口,数据处理完,进度条也走完了,这个窗口消失,回到数据处理窗口。Top

8 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-03 01:19:43 得分 0

这样,先建好一个对话框,里面有一个进度控件,CreateDialog,然后ShowWindow,在数据处理的过程序不断改变那个进度控件的值,在处理结束后EndDialog。  
   
  记住,不要DoModalTop

9 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-03 01:23:22 得分 10

无聊死了,一年没来,基础类都物是人非了!  
   
  唉,岁月蹉跎,时光如梭啊!Top

相关问题

关键词

得分解答快速导航

  • 帖主:gxning
  • dzq138
  • fireseed

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo