//进度条的更新函数
int g_Progress = 0;
void CFindFileDlg::RunProgressCtrl()
{
if(m_progress.GetPos() == 0)
{
m_progress.SetRange(0,100);
} static int nStep = 5; if(g_Progress == 0)
{
nStep = 5;
}
else if(g_Progress == 100)
{
nStep = -5;
} g_Progress += nStep;
m_progress.SetPos(g_Progress);
}RefreshList(); //这个函数最终会实现:根据后缀名,查找文件。//“查找” -- 按钮
void CFindFileDlg::OnBnClickedSearchFileByTime()
{
//如何实现:按下“查找”按钮后,进度条不断的向前移动,直到查找所有符合条件的文件才停止移动。
//也就是说,我希望RefreshList()函数和RunProgressCtrl()函数是同时开始,同时结束的!!!
//之前发了帖子问了一下,很多人说用多线程,所以就学了一下多线程,发现有很钟情况,什么临界啊什么的。
//想问有没简单一点的实现方法。
}

解决方案 »

  1.   

    //.h
    public:
    static UINT ThreadFunc(LPVOID lpParam); 
    CWinThread *m_pThread; //.cpp
    //“查找” -- 按钮
    void CFindFileDlg::OnBnClickedSearchFileByTime()
    {
    m_pThread = AfxBeginThread(ThreadFunc, &m_progress); //worker线程 RefreshList();
    }UINT CFindFileDlg::ThreadFunc( LPVOID lpParam )
    {
    CProgressCtrl *pCtrl = (CProgressCtrl*)lpParam;
    if(pCtrl->GetPos() == 0)
    {
    pCtrl->SetRange(0,100);
    } static int nStep = 5; if(g_Progress == 0)
    {
    nStep = 5;
    }
    else if(g_Progress == 100)
    {
    nStep = -5;
    } g_Progress += nStep;
    pCtrl->SetPos(g_Progress); return 0;
    }这样好像不对,哪里错了啊?
    结束进程怎么写啊?
      

  2.   

    头文件里定义:
    HANDLE Progress_thread;
    HANDLE Refresh_thread;
    unsigned Progress_threadid;
    unsigned Refresh_threadid;
    bool bover;实现:
    unsigned __stdcall Progress(void *obj)
    {
    CFindFileDlg *dlg;
    dlg = (CFindFileDlg *)obj;
            //这里进度条循环显示
             //判断bover是否为真就跳出循环
            return 0;
    }unsigned __stdcall Refresh(void *obj)
    {
    CFindFileDlg *dlg;
    dlg = (CFindFileDlg *)obj;
            RefreshList();
            dlg->bover=TRUE;
            return 0;
    }void CFindFileDlg::OnBnClickedSearchFileByTime()
    {
       Progress_thread = NULL;
       Refresh_thread = NULL;
       Progress_threadid =0;
       Refresh_threadid = 0;
       bover = FALSE;
       Progress_thread = (HANDLE)_beginthreadex( NULL, 0, Progress , this, 0, &Progress_threadid );
       Refresh_thread = (HANDLE)_beginthreadex( NULL, 0, Refresh , this, 0, &Refresh_threadid );
    }
      

  3.   

    使用一个全局的变量
    bool bTerminated = false;在Progress线程中
    while(bTerminated != true)
    {
      ...
    }另外,RefreshList()也是耗时过程,建议也放在线程中,在RefreshList执行后设置bTerminated为true
      

  4.   

    UINT CFindFileDlg::ThreadFunc( LPVOID lpParam )
    {
        CProgressCtrl *pCtrl = (CProgressCtrl*)lpParam;    if(pCtrl->GetPos() == 0)
        {
            pCtrl->SetRange(0,100);
        }    static int nStep = 5;     while(1)
        {
          if(g_Progress == 0)
          {
            nStep = 5;
          }
          else if(g_Progress == 100)
          {
            nStep = -5;
            //不想死循环就加个break
          }
           g_Progress += nStep;
           pCtrl->SetPos(g_Progress);
           sleep(1000);
        }    return 0;
    }
      

  5.   

    将RefreshList()作为线程,在线程中向窗口发消息,控制显示进度条