我现在用mfc编了一个简单的数学工具软件,有一个问题就是比如计算积分时可能耗时很长,像死机了一样,我想添加一个按键,按下后中止运算。
    我查资料发现需要多线程来解决,我就在计算前用AfxBeginThread新建了一个线程,然后定义了一个全局变量,按暂停键时改变它的值,在计算过程中检查,如果值改变就用AfxEndThread退出进程,可现在运行起来总是报错,(大概是 读取位置 0x00000000 时发生访问冲突)
   由于时间比较紧,实在没时间仔细研究了,哪位高手能帮我改一下?
我可以将程序的源代码发给你,帮我把这个功能添加上去,多谢了啊 

解决方案 »

  1.   

    现在不是不能结束,而是加了线程后普通的计算时都出错退出,我设断点调试时,计算过程中的某步就会显示:读取位置 0x8b55ff8b 时发生访问冲突,是怎么回事啊?
      

  2.   

    程序分好多文件,很长,怎么贴啊……
    我简化一下,你们看看是不是有更好的处理方法?CString temp1,temp2;  //全局变量,因为不知道怎么把输出字符串从Funproc里传出去……
    UINT FunProc( LPVOID pParam ) 

        Integral_Simpson *s=(Integral_Simpson*)pParam;
        double result=s->calculate(temp1);   //计算积分,temp1是读入的输入
         temp2.Format("%lf",result);  //将结果转换为字符,temp2是输出
    return 0;
    }
    void Page4::OnBnClickedButton2()
    {
    …………
       Integral_Simpson sample(low,high,itr); //一个积分方法的类
       temp1=Editcalculus; //Editcalculus是读入的CString输入   AfxBeginThread(FunProc,&sample); //新建一个线程
       Outcalculus=temp2; //Outcalculus是CString输出…………}
    double Integral_Simpson::calculate(CString input)  //计算积分的函数
    {
    …………
       for(int j=1;j<=nmax;j++)//nmax是迭代次数
    {
    if(stop==1)
       AfxEndThread(0);
           …………
             }
    …………
    }
    void CAboutDlg::OnBnClickedButton2()
    {
    // TODO: 在此添加控件通知处理程序代码
    stop=1;
    }
      

  3.   

    直接Suspend(hThread)不可以么
      

  4.   

    楼主你退出线程的方法是不是TerminateThread,如果是的话,那么你就是内存有冲突了,你可以加一个volatile修饰你的全局变量,不过还是有内存泄露,只是可以用,最好是用线程同步
      

  5.   

    我用AfxEndThread(0)退出的。你的意思是我的主线程和新建的线程同时访问了一个数据吗?那我怎么知道他们同时访问了谁呢?