BOOL CMessage::StartSend()
{
     ::AfxBeginThread((AFX_THREADPROC)SendThreadStart, this);
     return TRUE;
}线程函数
DWORD WINAPI SendThreadStart(void* pPara)
{
    CMessage *p = (CMsg*)pPara;
    int cnt;    CDlg *pDlg = (CDlg *)p->m_Wnd;
    pDlg->ShowProgress(0, 4);      -->  出错,  为什么?    
    //pDlg->Test(0, 4);             -->  不出错    
    ......
 
    for (cnt=0; cnt < p->Count; cnt++)
    {
          ......
    }    return TRUE;
}
bool CDlg::ShowProgress(int nMin, int nMax)
{
     m_ProgressCtrl.SetRange(nMin, nMax);
     m_ProgressCtrl.SetStep( (nMax - 0) / nMax );

     for (int i = 0; i<nMax; i++) 
     {
          Sleep(20);
    m_ProgressCtrl.StepIt();
     }
     return true;
}bool CDlg::Test(int nMin, int nMax)
{   
     CString str;     for (int i = 0; i<nMax; i++) 
     {
        str.Format(L" %d", i);
        MessageBox(str);  
     }
     return true;
}

解决方案 »

  1.   

    不要在线程中更新界面,应该发消息给界面线程来更新界面MFC窗口函数跨线程调用是不安全的,因为不能在句柄表中找到窗口句柄,会引发断言错误Test不涉及界面操作,没有问题
      

  2.   

    修改:
    在取得DLG窗体句柄时,发消息给HWND,在DLG得到消息时直接调用ShowProgress。其它修改方式,大家补充..
      

  3.   

    发消息也不行。 消息函数执行了,但进度条没变化.LRESULT CDlg::OnShowProgressMessage(WPARAM wParam, LPARAM lParam)

    int nMin = (int)wParam;
    int nMax = (int)lParam; m_ProgressCtrl.ShowWindow(true); m_ProgressCtrl.SetRange(nMin, nMax);
    m_ProgressCtrl.SetStep( (nMax - 0) / nMax );

    for (int i = 0; i<nMax; i++) 
    {
                Sleep(20);
        m_ProgressCtrl.StepIt();
    } return 1;
    }
      

  4.   

    进入消息处理函数了,值是正确的.LRESULT CDlg::OnShowProgressMessage(WPARAM wParam, LPARAM lParam)

    int nMin = (int)wParam;
    int nMax = (int)lParam; m_ProgressCtrl.ShowWindow(true); m_ProgressCtrl.SetRange(nMin, nMax);
    m_ProgressCtrl.SetStep( (nMax - 0) / nMax );

    for (int i = 0; i<nMax; i++) 
    {
            Sleep(20);
    m_ProgressCtrl.StepIt(); CString str;
    str.Format(L"%d", i);
    MessageBox(str);
    } return 1;
    }