解决方案 »

  1.   

    就是说CdemoDlg *pdemodlg2 = (CdemoDlg*)pParam2;后,这个pdemodlg2指针是空的,为0
    至于为什么会是空的,如果看不懂我上面的意思,那基本上你也解决不了了。找你同事中有工作经验的问吧
      

  2.   

    楼上大版说了比较清楚了,线程中不要操作界面控件,改成在线程中PostMessage消息,由主界面处理。
      

  3.   

    谢谢两位大神指导,我还是个学生。想要自己慢慢摸索些东西。各位大神能不能给我讲的细致一点。谢谢jason_wentzel大神的意思我好像懂了一些。
      

  4.   

    你把所有UI操作都放到主线程中,线程中只是PostMessage来通知UI
      

  5.   

    从来都不要把窗口指针直接传到线程函数中使用,从来都不要在多线程中直接操作UI,否则迟早都要出问题,因为MFC不是线程安全的,这一点在很多MFC书籍和MSDN上已经反复强调过了。
    不过话虽如此,在多线程中直接操作UI虽然迟早都有可能出错,但一般情况下出错概率还是比较低的,你这个出错的问题主要可能还是在自己的代码逻辑上。
    你把启动线程的代码贴出来看看,让我们看看pdemolg2的源头是怎么来的,在哪里赋值的。pdemolg2是由线程函数的参数pParam2传进来的,那么pParam2又是怎么来的。或者说你把pdemolg2弄成全局变量后,这个全局变量是在哪里赋值的,怎么赋值的,贴出来看看。
      

  6.   

    这里就启动线程:void CdemoDlg::OnBnClickedGetpoint()
    {

    AfxBeginThread(pointThread,(LPVOID)pdemolg2);}然后我在头文件里把pdemolg2定义为静态变量:
    static CdemoDlg* pdemolg2=NULL;
    UINT BirdThread(LPVOID pParam);
    UINT pointThread(LPVOID pParam2);
    谢谢啦  这么辛苦的帮我解答问题
      

  7.   

    在这个线程里我并没有试图修改UI啊。最多是最后那个render()绘制。但是我屏蔽掉这个依然是出现同样的问题。会不会是我在死循环里调用了CdemoDlg?在死循环里调用本身出错了?
      

  8.   

    static CdemoDlg* pdemolg2=NULL;
    你这里把pdemolg2赋值为NULL,然后传进去,这个pdemolg2不就一直都是NULL吗?
      

  9.   

    启动线程改成
    AfxBeginThread(pointThread,(LPVOID)this);
    试试
      

  10.   

    void CdemoDlg::OnBnClickedGetpoint()
    {AfxBeginThread(pointThread,(LPVOID)this);}
      

  11.   

    我之前是用this的但是会出现
    (ERROR: In ..\..\vtk\Rendering\vtkWin32OpenGLRenderWindow.cxx, line 247
    vtkWin32OpenGLRenderWindow (04C7B710): wglMakeCurrent failed in MakeCurrent(), error: 请求的资源在使用中。)这样的问题
      

  12.   

    你不必编写static CdemoDlg* pdemolg2=NULL,直接把this指针传入给线程即可。
      

  13.   

    空指针肯定会出错啊,空指针肯定不能调用啊。
    用this还出错的话就是代码逻辑的问题了,这个只能是你自己去调试,自己去解决了。
      

  14.   

    1.出现的错误是访问空指针导致的创建线程的时候,需要传入类的对象指针,可以使用全局变量(不建议)在CdemoDlg类中函数创建线程的时候,直接传入this指针参数就好了
    2.在操作界面的时候,应该让ui线程去处理,而不是逻辑线程操作界面控件等...