后台要长时间进行数据处理,如何加上进度条,不使界面象死了一样.
在执行数据处理时,我加了一个等待的线程,但没效果,为什么?
代码:UINT Wait(LPVOID lParam)
{
while (1)
{
g_nPos += 5;
if(g_nPos == -85)
AfxMessageBox("DFDF");
g_ctrlProgress.SetPos(g_nPos);
if(g_nPos == 700)
g_nPos = -100; if(g_bResult == TRUE)
return 0; // Sleep(1000*5);             //每5秒检测一次
}
}
//加上等待进程
HWND h = GetSafeHwnd();
AfxBeginThread((AFX_THREADPROC)Wait, h);

解决方案 »

  1.   

    如果你的数据处理是一个循环,你可以在循环里传递消息for(int i=0;i<1000000;i++)
    {
    ...
    MSG      msg;
    if(GetMessage (&msg, NULL, 0, 0))
    {
    WindowProc(msg.message,msg.wParam,msg.lParam);
    }
    }
      

  2.   

    for(int i=0;i<1000000;i++)
    {
    //
    m_progress.SetPos(i/10000);
    m_progress.Invalidate();
    MSG      msg;
    if(GetMessage (&msg, NULL, 0, 0))
    {
    WindowProc(msg.message,msg.wParam,msg.lParam);
    }
    }
      

  3.   

    在对话框的一个成员函数里开启一个线程,在线程中来控制Progress的进度
    CMyDlg::StartProgress()
    {
         m_bRunProgress = TRUE;
         m_ProgressBar.SetRange(...);//设置进度的显示范围
         AfxBeginThread(Progress,(LPVOID*)this,THREAD_PRIORITY_NORMAL);
    }
    CMyDlg::StopProgress()
    {
         m_bRunProgress = FALSE;
    }
    线程函数:
    UINT Progress(LPVOID pParam);//函数声明
    UINT Progress(LPVOID pParam)
    {
         CMyDlg *pDlg = (CMyDlg *)pParam;
         int iCount = 0;
         while(pDlg->m_bRunProgress)
         {
             //Do Some processing
             pDlg->m_ProgressBar.SetPos(iCount);
             iCount++;
         }
         return 0;
    }