To jiangsheng(蒋晟) 
在我的类中,读100M的数据文件处理,如何把数据处理进度返回给用户?

解决方案 »

  1.   

    计算应该和处理进度条分开。在计算的时候,可以返回已经处理的比例给用户!
    用户,可以SetTimer() 来检测比例从而来处理progressbar!
      

  2.   

    1。在类的构造函数中要求用户提供一个窗口句柄和矩形区域,分别作为进度条的父窗口和尺寸,而将进度条本身作为类的一个成员;
    2。在构造函数中创建进度条;
    3。每次调用完ReadFile,根据读的字节数刷新进度条;
    4。析构函数销毁进度条。
    5。最好在类中另外启动一个线程完成这些事,避免主窗口失去响应。
      

  3.   

    不对.你可以在界面上放一个进度条,过一定时间刷新之。刷新到什么程度,你可用一全局变量,或者把进度条的指针传给定义的类,由它来制进度条的刷新,不过记得要给进度条一点机会,不然它不会更新的,即使调用了SetX函数.
      

  4.   

    Cline(元元)说得对,在计算的线程中一定要在某一时刻调用Sleep之类的东西,给其它线程一点CPU处理时间,否则一路计算下去,你的进度条根本就不会响应OnTimer之类的东西。
      

  5.   

    你可以通过一个回调函数或者是CTimer事件来更新进度条,通过回调函数进行刷新,这样在你定义的类中只要把当前进度传递出去,由外界来控制进度条就可以了。
      

  6.   

    处理的过程中不断地返回状态信息,用OnTimer来根据状态信息处理界面。
      

  7.   

    : azuo_lee() (2001-9-7 16:35:55) 的最好!我站成
      

  8.   

    如果用多线程的话,就用一个全局变量好了,在子线程中对它增减,在主线程中每隔一定的时间去访问它一更新你的进度条(好像不需要同步,因为一个只读一个只写,很简单了);如果用单线程,那就在你的类中保存一个进度条的指针,在费时的循环中可以如下写代码:
    CClass::Function()
    {
        for()
       { 
         m_pProgressWnd->SetPos();
         while(::PeekMessage(&msgNULL,NULL,X_NOREMOVE))
         {
             ::TranslateMessage(msg);
             ::DispatchMessage(msg);
          }
       }
    }
      

  9.   

    Sorry,其中少了一句GetMessage(msg)。
      

  10.   

    其实就创个含进度条的非摸态对话框,自己在数据处理时SETPOS,再UpdateWindow就可。
      

  11.   

    可以在你的类初始化的时候传递一个进度条的指针,在函数执行的过程中设置位置就行
    也可以传递一个static窗口的指针,进度条可以自己画,而且自己画的更好看。:)
    下面是一个简单的Static进度条画法(双色进度):
    void ShowProgress(int i)//0<=i<=100
    {
    CDC* pDC=pWnd->GetDC();
    CRect lr,rr,cr;
    pWnd->GetClientRect(&cr);
    lr=rr=cr;
    lr.right=((cr.Width()*i/100);
    rr.left=lr.right;CRgn rgnl,rgnr;
    rgnl.CreateRectRgnIndirect(lr);
    rgnr.CreateRectRgnIndirect(rr);
    CBrush* pBrush=CBrush::FromHandle(GetSysColorBrush(COLOR_HIGHLIGHT));
    pDC->FillRect(&lr,pBrush);
    CString str;
    str.Format("%d",i);
    str+="%";
    pDC->SelectClipRgn(&rgnl);
    pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
    pDC->SetBkColor(GetSysColor(COLOR_HIGHLIGHT));
    pDC->DrawText(str,cr,DT_VCENTER|DT_CENTER|DT_SINGLELINE);
    pDC->SelectClipRgn(&rgnr);
    pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));
    pDC->SetBkColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
    pDC->DrawText(str,cr,DT_VCENTER|DT_CENTER|DT_SINGLELINE);pWnd->ReleaseDC(pDC);
    }