向各位请教一个问题:我在一个子线程中调用一个函数,在进入函数内部后,有的时候还没执行完就直接退出函数了,什么原因会导致这种情况呢?我的调用函数如下:
class A
{
CString FuncA(LPCTSTR lpszParam) // 子线程中调用的函数
{
CString strRet;
OutputDebugStr(_T("Call FuncA Begin")); //............. OutputDebugStr(_T("Call FuncA End")); return strRet;
}
};出现以上那种情况时,看到“Call FuncA End”没有打印出来。

解决方案 »

  1.   

    你的主线程退出了会导致你的子线程还没执行完就退出了。例如主线程是main函数,main函数返回了,其他子线程都会跟着退出。
      

  2.   

    能看到Call FuncA Begin而不能看到 Call FuncA End,是否你使用了TerminateThread?
      

  3.   

    没有使用“TerminateThread”
    在大部分的计算机上运行是没有问题的,但是在个别机器上会出现这种情况。另:如果我在FuncA的核心代码前加上一个AfxMessageBox或者写一些信息到文件中,在那些异常的机器上也能看到Call FuncA End,结果也是正常的。
      

  4.   

    而且调用这个函数FuncA的函数FuncB,能看到FuncA函数返回了,因为这个时候有信息打印出来的。
      

  5.   

    FuncA为什么要写在class A中呢,像这种作为线程入口的函数最好声明为全局的
      

  6.   

    线程的入口函数是全局的,线程函数调用了class A的一个函数FuncB,然后FuncB调用了classA的FuncA
      

  7.   

    CString strRet;
            OutputDebugStr(_T("Call FuncA Begin"));        //.............
             你这中间是不是有代码段可以直接return啊?
            OutputDebugStr(_T("Call FuncA End"));        return strRet;
      

  8.   

    FuncA还有没有其他出口?
    是不是FuncA 在OutputDebugStr(_T("Call FuncA End")); 这句之前return了呢?
      

  9.   

    FuncA已经没有其他出口了,因为这样才觉得非常奇怪,唉
      

  10.   

    多加一点Dbg Msg来确认是在那个function 退出的,先把问题隔离开来!
      

  11.   

    线程退出有几种情况:
    (1)在主线程调用了退出线程的函数,比如:TerminateThread(hand);
    (2)主线程退出;
    (3)线程函数自己跳出;
    (4)线程函数执行完毕。
    你这个问题我觉得最主要的是你的主线程可能在子线程退出前就退出了。主线程退出前检查一下子线程是不是结束了。
      

  12.   

    各位,我想说明一点,我的线程没有退出,只是线程中调用的函数B中调用的函数A没有看到执行完就跳出来了,谢谢baolei的建议,我也会这么做的,呵呵。
      

  13.   

    是打印了 "Call FuncA Begin" 而没有打印 "Call FuncA End" 吗?
    线程返回正常值吗?
      

  14.   

    1.子线程还没有执行完,main\WinMain 返回了。
    2.使用了terminalthread强制结束线程。
      

  15.   

    很有可能是主线程退出,顺带着杀死了工作线程。简单的方法,可以让主线程休眠 sleep 或 其他的,测试一下
      

  16.   

    打印返回值strRet看有没有,可能是死锁了你又没检测到,而且在部分线程死锁的情况下,整个进程还是有可能继续执行的
      

  17.   

    1.TerminateThread了
    2.主线程挂了
    3.代码中有未发现的返回 or 类似 if () ; return 这样的手误
    4.代码不是异常安全的,最后输出函数前某个函数抛出了异常,而在外层 catch 了,导致流程直接跳过
      

  18.   

    恩,多谢楼上各位的回答了,之前一直没空好好查,这次查确实不是函数调用无故退出了,是函数中openfile失败了,想问下各位在线程中打开文件有时会失败吗?