写了一个死循环的线程。demo.exe 中的 0x01374089 处有未经处理的异常: 0xC0000005: 写入位置 0x000000c8 时 线程异常指针MFC内存 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就是说CdemoDlg *pdemodlg2 = (CdemoDlg*)pParam2;后,这个pdemodlg2指针是空的,为0至于为什么会是空的,如果看不懂我上面的意思,那基本上你也解决不了了。找你同事中有工作经验的问吧 楼上大版说了比较清楚了,线程中不要操作界面控件,改成在线程中PostMessage消息,由主界面处理。 谢谢两位大神指导,我还是个学生。想要自己慢慢摸索些东西。各位大神能不能给我讲的细致一点。谢谢jason_wentzel大神的意思我好像懂了一些。 你把所有UI操作都放到主线程中,线程中只是PostMessage来通知UI 从来都不要把窗口指针直接传到线程函数中使用,从来都不要在多线程中直接操作UI,否则迟早都要出问题,因为MFC不是线程安全的,这一点在很多MFC书籍和MSDN上已经反复强调过了。不过话虽如此,在多线程中直接操作UI虽然迟早都有可能出错,但一般情况下出错概率还是比较低的,你这个出错的问题主要可能还是在自己的代码逻辑上。你把启动线程的代码贴出来看看,让我们看看pdemolg2的源头是怎么来的,在哪里赋值的。pdemolg2是由线程函数的参数pParam2传进来的,那么pParam2又是怎么来的。或者说你把pdemolg2弄成全局变量后,这个全局变量是在哪里赋值的,怎么赋值的,贴出来看看。 这里就启动线程:void CdemoDlg::OnBnClickedGetpoint() { AfxBeginThread(pointThread,(LPVOID)pdemolg2);}然后我在头文件里把pdemolg2定义为静态变量:static CdemoDlg* pdemolg2=NULL;UINT BirdThread(LPVOID pParam);UINT pointThread(LPVOID pParam2);谢谢啦 这么辛苦的帮我解答问题 在这个线程里我并没有试图修改UI啊。最多是最后那个render()绘制。但是我屏蔽掉这个依然是出现同样的问题。会不会是我在死循环里调用了CdemoDlg?在死循环里调用本身出错了? static CdemoDlg* pdemolg2=NULL;你这里把pdemolg2赋值为NULL,然后传进去,这个pdemolg2不就一直都是NULL吗? 启动线程改成AfxBeginThread(pointThread,(LPVOID)this);试试 void CdemoDlg::OnBnClickedGetpoint() {AfxBeginThread(pointThread,(LPVOID)this);} 我之前是用this的但是会出现(ERROR: In ..\..\vtk\Rendering\vtkWin32OpenGLRenderWindow.cxx, line 247vtkWin32OpenGLRenderWindow (04C7B710): wglMakeCurrent failed in MakeCurrent(), error: 请求的资源在使用中。)这样的问题 你不必编写static CdemoDlg* pdemolg2=NULL,直接把this指针传入给线程即可。 空指针肯定会出错啊,空指针肯定不能调用啊。用this还出错的话就是代码逻辑的问题了,这个只能是你自己去调试,自己去解决了。 1.出现的错误是访问空指针导致的创建线程的时候,需要传入类的对象指针,可以使用全局变量(不建议)在CdemoDlg类中函数创建线程的时候,直接传入this指针参数就好了2.在操作界面的时候,应该让ui线程去处理,而不是逻辑线程操作界面控件等... 怎样实现子窗口关闭后父窗口也关闭 为即将来临的七夕散分,祝天下有情人终成眷属 我的socket怎么总是报错啊,应当怎么设置啊? 关于内存泄漏的问题 怎么修改一个程序中的某些字符串?100分! 谁使用过MSDN宇宙版? 密码操作问题!有胆量者进来! to ssfeng "繊@"----------------来了。。。又是socket的问题。。。送分~~!! 请问一个关于字符串问题! 天下怪事啊,我第一次看见!编程老手都来看看吧,怎么会这样! 能不能在ADO中对dbf文件的记录号进行操作如果可以,SQL语句怎么写最后的27分了
至于为什么会是空的,如果看不懂我上面的意思,那基本上你也解决不了了。找你同事中有工作经验的问吧
不过话虽如此,在多线程中直接操作UI虽然迟早都有可能出错,但一般情况下出错概率还是比较低的,你这个出错的问题主要可能还是在自己的代码逻辑上。
你把启动线程的代码贴出来看看,让我们看看pdemolg2的源头是怎么来的,在哪里赋值的。pdemolg2是由线程函数的参数pParam2传进来的,那么pParam2又是怎么来的。或者说你把pdemolg2弄成全局变量后,这个全局变量是在哪里赋值的,怎么赋值的,贴出来看看。
{
AfxBeginThread(pointThread,(LPVOID)pdemolg2);}然后我在头文件里把pdemolg2定义为静态变量:
static CdemoDlg* pdemolg2=NULL;
UINT BirdThread(LPVOID pParam);
UINT pointThread(LPVOID pParam2);
谢谢啦 这么辛苦的帮我解答问题
你这里把pdemolg2赋值为NULL,然后传进去,这个pdemolg2不就一直都是NULL吗?
AfxBeginThread(pointThread,(LPVOID)this);
试试
{AfxBeginThread(pointThread,(LPVOID)this);}
(ERROR: In ..\..\vtk\Rendering\vtkWin32OpenGLRenderWindow.cxx, line 247
vtkWin32OpenGLRenderWindow (04C7B710): wglMakeCurrent failed in MakeCurrent(), error: 请求的资源在使用中。)这样的问题
用this还出错的话就是代码逻辑的问题了,这个只能是你自己去调试,自己去解决了。
2.在操作界面的时候,应该让ui线程去处理,而不是逻辑线程操作界面控件等...