首先 祝大家中秋节快乐!提问:  小弟我现在面临一个问题,我在一个工程中处理一些数据比较庞大,等待时间比较长,现在想在处理数据的过程中 开辟一个新的线程,该线程显示一个对话框,对话框中加了一个CProgressCtrl控件来不断的显示滚动,等待数据处理完成后,对话框消失.请教如何实现?尽量详细些,多谢

解决方案 »

  1.   

    //线程 
    BOOL CImgExportThread::InitInstance()
    {
    // TODO:  perform and per-thread initialization here m_bEnd = FALSE;
    return TRUE;
    }
     int CImgExportThread::Run() 
    {
    CExportXysFtDlg * pDlg = new CExportXysFtDlg();
    pDlg->Create(IDD_DIALOG_EXPORT_XYSFT,NULL);
      pDlg->ShowWindow(SW_SHOW); while (!m_bEnd)
    {
    pDlg->Run();
    } pDlg->DestroyWindow();
    delete pDlg;

    return 1;// return CWinThread::Run();
    }//进度条对话框BOOL CExportXysFtDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    m_progressCtrl.SetRange(0,100);
    m_progressCtrl.SetStep(5);
    m_progressCtrl.SetPos(0);

    m_bRun = FALSE; return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }void CExportXysFtDlg::Run()
    { for (int i=0;i<20;i++)
    {
    m_progressCtrl.SetPos(i*5);
    Sleep(100);
    }}
    //调用线程的主函数CImgExportThread* pTh = NULL;
    BOOL CRasterViewDlg::ExportRasterLayer()
    { CString strFilters = "TIFF Files (*.tif)|*.tif||";
    CFileDialog fDlg(FALSE,"","",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,strFilters);
    if(fDlg.DoModal() != IDOK) return FALSE; CString strPath,strName,strFormat,strT;
    strPath = fDlg.GetPathName();
    strName = fDlg.GetFileName();
    int n = strPath.ReverseFind('\\');
    strPath = strPath.Left(n+1); pTh = (CImgExportThread*)::AfxBeginThread(RUNTIME_CLASS(CImgExportThread),
    THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); 
    pTh->ResumeThread();

    Sleep(10000);//这里本是数据处理段,现我用10秒时间等待代替数据处理,而且我的数据处理时间不定
    pTh->m_bEnd = TRUE;
    AfxMessageBox("导出完成!");

    return TRUE;
    }
    按照我现在的代码,实现不了,进度条对话框不能正常显示请大虾们赐教!
      

  2.   

    To:
     akirya(坏[其实偶不是什么所谓的坏人]) ( ) 信誉:97  2007-9-26 11:52:49  得分: 0  
     
     
       
    如果你要在线程内创建一个对话框的话,那么这个线程需要消息循环.  
    -----------------------------------------------------------------------------------
    消息循环怎么搞?
      

  3.   

    直接::AfxBeginThread(ThreadProc/*线程处理函数*/,
    THREAD_PRIORITY_NORMAL,this/*传递对话框指针*/, CREATE_SUSPENDED);int WINAPI ThreadProc(LPVOID pointer)
    {
     CRasterViewDlg* pDlg = (CRasterViewDlg*)pointer;//将接受到的LPVOID类型的指针强制类型转换
     pDlg->m_progressCtrl.SetPos(xxxxx);
    }
      

  4.   

    To:  wltg2001(红猪) ( ) 信誉:100  2007-09-26 14:46:58  得分: 0  
     
     
       一般这种问题中线程中只是用来处理数据,对话框还是放在主线程中
      
     
    ---------------------------------------------------------------------------本来我也是这么做的,但是我的数据处理 调用的其他的组件实现的,在主线程处理才成功,放到线程里处理 失败,这个我测试过不行,才用现在这个方法,求教!
      

  5.   

    To:  jimoguilai() ( ) 信誉:100  2007-09-26 14:02:36  得分: 0  
     
     
       直接::AfxBeginThread(ThreadProc/*线程处理函数*/,
    THREAD_PRIORITY_NORMAL,this/*传递对话框指针*/, CREATE_SUSPENDED);int WINAPI ThreadProc(LPVOID pointer)
    {
     CRasterViewDlg* pDlg = (CRasterViewDlg*)pointer;//将接受到的LPVOID类型的指针强制类型转换
     pDlg->m_progressCtrl.SetPos(xxxxx);
    }
      
    ____________________________________________________________________________________请问这个方法 怎么不断的刷新CProgressCtrl的进度,难道要不断的SetPos(xxxxx),那线程执行函数要不断的执行吗?
      

  6.   

    根据你自己数据处理的进度来SetPos阿
      

  7.   

    int WINAPI ThreadProc(LPVOID pointer)
    {
     CRasterViewDlg* pDlg = (CRasterViewDlg*)pointer;//将接受到的LPVOID类型的指针强制类型转换 处理1
     pDlg->m_progressCtrl.SetPos(xxxxx); 处理2
     pDlg->m_progressCtrl.SetPos(xxxxx); 处理3
     pDlg->m_progressCtrl.SetPos(xxxxx);}数据处理 取不到它的执行进度
    ----------------------------
    那就要求修改你的数据处理组件接口,要求能返回正确的进度。
    比如现在你的数据处理组件接口为一个函数接口 DealData();
    那么它应该修改为 beginDealData()
     while( !EndDealData() )
    {
      int nProgress =  DealData();
      pDlg->m_progressCtrl.SetPos( nProgress  );
    };