将单文档切分的两个视图用多线程运行,也就是说两个视图各自运行,互不干扰
我一个视图来显示OPGL做的3D演示,另外一个是普通的视图,现在在普通视图上只要运行画图工作,OPGL那个部分就动不了了,有没有高手来帮忙解决一下啊
如果单文档的不行,多文档的怎么做啊,我就要求两个视图各自运行,互不干扰

解决方案 »

  1.   

    如果是这种情况,确实应该把OPGL窗口创建成一个独立的界面线程,但不要跟主线程有过多的消息通信。没必要做成MDI,甚至做成SDI都没有必要,直接用对话框可能更容易一些。
    创建过程其实也简单,对话框先创建好,然后启动线程,在线程中做COM初始化和OPGL初始化,创建一个以对话框窗口为父窗口的窗口,设置好在父窗口上的位置即可。
      

  2.   

    CWinThread * m_opengldraw,*m_normaldraw;   //定义了2个线程的指针
    static UINT Drawnormalproc(LPVOID p);   
    static UINT Drawopenglproc(LPVOID p);//2个线程的函数
    CEvent DrawNormalEvent,DrawOpenglEvent;    //2个线程的事件为
    然后别忘了在构造函数里出使化为null;
    在OnDraw里写
    m_opengldraw=AfxBeginThread(Drawopenglproc,this,THREAD_PRIORITY_NORMAL,0,0,NULL);  //m_Drawopenglproc是画opengl线程的函数名字,
    m_normaldraw=AfxBeginThread(Drawnormalproc,this,THREAD_PRIORITY_NORMAL,0,0,NULL);//同上
    DrawNormalEvent.SetEvent();
    DrawOpenglEvent.SetEvent();
    然后在
    UINT CDataView::Drawnormalproc(LPVOID param)
    {
    CDataView* p=(CDataView*)param;
    while (1)    //这是个死循环为了这个线程一直在跑
    {
    ::WaitForSingleObject(p->DrawNormalEvent.m_hObject,INFINITE);
                 //在这里添加你的顶层的绘图函数 ,p是CDataView的指针,你可以随意调用CDataView的函数了。 }
    return 1;
    }
    没有仔细看啊,你可能还要稍微改一改。我也不确定自己写的一定对啊:)
      

  3.   

    高手啊,我已经用单文档划分了两个视图类了,两个视图类都有自己的ONDraw啊
      

  4.   

    一个视图来显示OPGL做的3D演示(键盘触发演示动作,汽车根据上下键移动),另外一个是普通的视图,现在在普通视图上只要运行画图工作(画汽车行进轨迹),OPGL那个部分就动不了了,有没有高手来帮忙解决一下啊 
    如果单文档的不行,多文档的怎么做啊,我就要求两个视图各自运行,互不干扰
      

  5.   

    OPGL那个部分程序是否本身就有问题?