界面上有个进度条,所以开了线程做读写文件的操作
还有个控件,可载入所生成的图形文件
函数是SetSrc(),参数是文件名
现在在工作者线程中进行读写一切正常,但是想让控件显示出所生成的图形就报错
项目急,各位高人出出主意啊!!

解决方案 »

  1.   

    UINT ProgressThread(LPVOID pParam)
    {
    CMinDistanceDlg* pDialog = (CMinDistanceDlg*) pParam; switch(eNextTask)
    {
    case OPEN_FILE:
    pDialog->m_solid.InitSolid(pDialog->m_sFile);
    break;
    case EXPERT_TO_DXF:
    pDialog->m_solid.expertToDXF(strTempDXFFile);
    break;
    case LOAD_DXF_FILE:
    pDialog->m_avviewx.SetSrc(strTempDXFFile);//报错
    break;
    } eNextTask = (Task) ((eNextTask + 1) % 3);
    return 0;
    }void CMinDistanceDlg::OnBtnOpenFile() 
    {
    // TODO: Add your control notification handler code here
    char szFilters[] = "NFF Files(*.nff);OFF Files(*.off)|*.nff;*.Off||";
    CFileDialog m_LoadFile(TRUE,"","",OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,szFilters,this);
    if(m_LoadFile.DoModal() == IDOK)
    {
    m_sFile = m_LoadFile.GetPathName();
    SetWindowText("minDistance -[" + m_sFile + "]");
    m_sProgressInfo = "Opening file ...";
    m_sOpenTime = "";
    UpdateData(FALSE);

    SYSTEMTIME tOpenBegin;
    SYSTEMTIME tOpenEnd;
    GetSystemTime(&tOpenBegin);
    DoTaskInNewThread();
    GetSystemTime(&tOpenEnd);
    m_sOpenTime.Format("%f milliseconds", ::getTimeUsed(tOpenBegin, tOpenEnd));
    UpdateData(FALSE);

    m_sProgressInfo = "Creating DXF file ...";
    UpdateData(FALSE);
    DoTaskInNewThread(); m_sProgressInfo = "Loading DXF file ...";
    UpdateData(FALSE);
    DoTaskInNewThread(); m_sProgressInfo = "Done";
    UpdateData(FALSE);
    m_progress.SetPos(0);
    }
    }void CMinDistanceDlg::DoTaskInNewThread()
    {
    CWinThread *m_pThread;
    m_pThread = AfxBeginThread(ProgressThread, (LPVOID) this,THREAD_PRIORITY_NORMAL, 0, 0, NULL); m_progress.SetPos(0);
    Task eCurrentTask = eNextTask;
    while(eNextTask == eCurrentTask)
    {
    m_progress.StepIt();
    Sleep(150);
    }
    m_progress.SetPos(100);
    }
      

  2.   

    试试不要 pDialog->m_avviewx.SetSrc(strTempDXFFile);//报错
    而是向这个对话框PostMessage一个自定义消息,在你的对话框中实现对自定义消息的处理
      

  3.   

    我的控件已经放在CMinDistanceDlg上了,如果把
    m_avviewx.SetSrc(strTempDXFFile);
    放在CMinDistanceDlg::OnBtnOpenFile()里就能正常执行,但是进度条不跑,
    现在放到工作者线程里,进度条可以正常跑,但是就这个函数报错
    我该怎么办啊,急
      

  4.   

    pDialog->PostMessage(你的自定义消息)
    ?我没说明白?
      

  5.   

    pDialog->PostMessage,这样子一样会有问题,而应该将pDialog->GetSafeHwnd()传给工作者线程,工作者线程应该通过PostMessage(hwndDialog......);
      

  6.   

    这是因为CWnd::FromHandle用到了一个与线程本地存储有关的MAP(MFC干的),
      

  7.   

    TO:barsteng(barsteng)
    假设我定义了一个消息,也用PostMessage传过去啦,
    那我处理这个消息的函数将完成
    m_avviewx.SetSrc(strTempDXFFile);
    但是我把让进度条在m_avviewx装载文件时滚动的功能放在哪呢,如果也放在接收消息的函数里肯定是要等到装载完了才能执行啊