问题是这样的,我有一个函数执行速度非常的慢,我想给此函数加一个进度条来显示它的执行进度。大家给帮忙出个主意。

解决方案 »

  1.   

    如何知道函数的执行时间,而且如果函数参数,或者是cpu类型不一样,它的执行时间也不一样啊。
      

  2.   

    可以不用线程来实现进度条的加载,利用二次消息循环异步地加载,代码如下:
    void CDoeventsDlg::DoEvents() 

        MSG msg; 
        if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { //从Windows消息队列中取出消息 
            if (msg.message== WM_QUIT)//如果消息为退出,发送退出消息 
            { 
                ::PostQuitMessage(-1); 
            } 
            if(!AfxGetApp()->PreTranslateMessage(&msg))//如果无法预处理消息 
            { 
                ::TranslateMessage(&msg);//转换消息 
                ::DispatchMessage(&msg);//发送消息 
            } 
        } 
        AfxGetApp()->OnIdle(0);AfxGetApp()->OnIdle(1);//消息队列为空时闲置一段时间 
    } /* ------------------------------------------------------------------------- 
          Large Large task... 
      ------------------------------------------------------------------------- */ void CDoeventsDlg::OnTask() 

      int iStep  = 0; 
      m_pgProgress.SetRange(0, 500 );//设置进度条范围 
      m_pgProgress.SetStep(1);//步长 
      m_pgProgress.SetPos(0);//初始位置 
      m_bIsWorking = TRUE; 
      m_bStop      = FALSE;//是否停止工作 
      m_pbTask.EnableWindow(FALSE); 
      while(!m_bStop && iStep <= 500) { 
          iStep++;      
          m_pgProgress.StepIt(); //这里完成实际的操作。 
          Sleep(20); 
          DoEvents();      // 二次消息循环函数,这里就可以响应界面操作了。 
      }  
      m_bIsWorking = FALSE; 
      m_pgProgress.SetPos(0); 
      m_pbTask.EnableWindow(TRUE); 

    在这里的PeekMessage不能使用PM_NOREMOVE,否则界面会僵死的。