单文档程序.有view1和view2,view1和view2的内容都已经定义完。
view1是当前view,在其它类中有一个线程,动态创建view2时出现系统错误,出错语句如下,请问如何解决,应该注意些什么?
也就是想通过线程判断数据,然后view1切换到view2.pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD , CFrameWnd::rectDefault, this, nForm, &context);nForm是view2的ID。感谢!!

解决方案 »

  1.   

    你上面的Create的代码放在那里写的?在线程函数中写的???
      

  2.   

    你这种东西还是放到UI线程中去创建View视图吧~
      

  3.   

    UI控件一般不是线程安全的,最好在UI主线程里来创建VIEW视图。
      

  4.   

    在CMainFrame里调用的SwitchToForm方法
    void CMainFrame::SwitchToForm(int nForm) //进行视图切换的代码函数
    {
    //CDocument* pDoc = GetActiveDocument();
    //CMainFrame* pFrame=(CMainFrame*)AfxGetMainWnd();
    //CWindVoltageWarningView* pView=(CWindVoltageWarningView*)pFrame->GetActiveView();  CView *pOldActiveView=GetActiveView(); //保存旧视图
      CView *pNewActiveView=(CView*)GetDlgItem(nForm); //取得新视图
    //CView *pOldActiveView=(CView*)pFrame->GetActiveView(); //保存旧视图
      //CView *pNewActiveView=(CView*)pFrame->GetDlgItem(nForm); //取得新视图
      if(pNewActiveView==NULL)
      {
      switch(nForm)
      //这些ID是对话框的标志符,但也可以用其他的标志
      {
      case IDD_WINDVOLTAGEWARNING_VIEW :
      pNewActiveView=(CView*)new CWindVoltageWarningView;
      break;
      case IDD_WINDVOLTAGEWARNING_VIEW1 :
      pNewActiveView=(CView*)new CWindVoltageWarningView1;
      break;
        
      }
    在线程中是这样写的。
    CMainFrame* pFrame=(CMainFrame*)AfxGetMainWnd();
    pFrame->SwitchToForm(IDD_WINDVOLTAGEWARNING_VIEW1);   
      

  5.   

    刚才SwitchToForm方法没写完
    void CMainFrame::SwitchToForm(int nForm) //进行视图切换的代码函数
    {
      CView *pOldActiveView=GetActiveView(); //保存旧视图
      CView *pNewActiveView=(CView*)GetDlgItem(nForm); //取得新视图
      if(pNewActiveView==NULL)
      {
      switch(nForm)
      //这些ID是对话框的标志符,但也可以用其他的标志
      {
      case IDD_WINDVOLTAGEWARNING_VIEW :
      pNewActiveView=(CView*)new CWindVoltageWarningView;
      break;
      case IDD_WINDVOLTAGEWARNING_VIEW1 :
      pNewActiveView=(CView*)new CWindVoltageWarningView1;
      break;
        
      }
      CCreateContext context; //将文挡和视图相连
      context.m_pCurrentDoc=pOldActiveView->GetDocument();
    pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD ,
      CFrameWnd::rectDefault, this, nForm, &context);
      pNewActiveView->OnInitialUpdate();
      }
      SetActiveView(pNewActiveView); //改变活动的视图
      pNewActiveView->ShowWindow(SW_SHOW); //显示新的视图
      pOldActiveView->ShowWindow(SW_HIDE); //隐藏旧的视图  if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CWindVoltageWarningView))
    pOldActiveView->SetDlgCtrlID(IDD_WINDVOLTAGEWARNING_VIEW);else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CWindVoltageWarningView1))
    pOldActiveView->SetDlgCtrlID(IDD_WINDVOLTAGEWARNING_VIEW1);  pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    delete pOldActiveView; //删除旧视图
    RecalcLayout(); //调整框架