mfc 线程问题 会报内存不可读来帮下忙吧
基于对话框的只有一个onok()在onok()里有一个线程线程没有任何执行可是在退出进还会出在这样。voidCMy11Dlg::OnOK(){//TODO:Addextr...
基于对话框的 只有一个onok() 在onok()里有一个线程 线程没有任何执行 可是在退出进还会出在这样。
void CMy11Dlg::OnOK() { // TODO: Add extra validation here CWinThread *th =AfxBeginThread(fun,this);
th->Run();//为了保证线程运行 CDialog::OnOK();}
UINT CMy11Dlg::fun(LPVOID pParam){ return 0;} 展开
void CMy11Dlg::OnOK() { // TODO: Add extra validation here CWinThread *th =AfxBeginThread(fun,this);
th->Run();//为了保证线程运行 CDialog::OnOK();}
UINT CMy11Dlg::fun(LPVOID pParam){ return 0;} 展开
2个回答
展开全部
根据你的函数,就是因为你线程里头什么都没有做,所以才会报错的。
因为当你调用afxbeginthread的时候,fun就已经执行了,可是因为fun函数里头什么都没有,所以函数马上就执行完成退出了。
当你使用th->run时,由于fun的进程已经结束,所以th指针指向的内存也已经释放,当然就不能为read了。
你应该在fun里头添加一个循环函数,如while(1){/*添加退出条件*/}你就可以测试线程的Run、SuspendThread等功能了。
另外,最好如bhtzu说的,把CDialog::OnOK();给注释掉
因为当你调用afxbeginthread的时候,fun就已经执行了,可是因为fun函数里头什么都没有,所以函数马上就执行完成退出了。
当你使用th->run时,由于fun的进程已经结束,所以th指针指向的内存也已经释放,当然就不能为read了。
你应该在fun里头添加一个循环函数,如while(1){/*添加退出条件*/}你就可以测试线程的Run、SuspendThread等功能了。
另外,最好如bhtzu说的,把CDialog::OnOK();给注释掉
更多追问追答
追问
我不用run(),无法保证线程一定运行啊,主线程一结束,子线程就没了,没法保证执行,我才出此下策用.run()用他优先于主线程调用,请问有更好的办法要子线程一定执行吗?谢谢
追答
1.我不太明白你为什么要在OnOk的时候执行这个子线程,如果你这个是一个对话框的程序,当你调用OnOK的时候就是要结束所有执行的操作了,那还要子线程干什么工作呢,要这个子线程和什么做交互呢。
2.当你调用Afxbeginthread的时候,子线程就会执行了。你觉得子线程没有执行的原因不是因为没有启动,而是你的自线程里头没有持续执行的机制。子线程不是说你启动了就一直存在的,当子线程执行完指定操作后也是会退出的。
3.如果你是想程序退出后,子线程还在执行,那我觉得你的设计思路就是有问题了。一般要做后台程序,你可以做成服务类型的,或者把界面隐藏了。当子线程还在工作的时候,主线程还是会自工作的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询