向各位请教一个问题:我在一个子线程中调用一个函数,在进入函数内部后,有的时候还没执行完就直接退出函数了,什么原因会导致这种情况呢?我的调用函数如下:
class A
{
CString FuncA(LPCTSTR lpszParam) // 子线程中调用的函数
{
CString strRet;
OutputDebugStr(_T("Call FuncA Begin")); //............. OutputDebugStr(_T("Call FuncA End")); return strRet;
}
};出现以上那种情况时,看到“Call FuncA End”没有打印出来。
class A
{
CString FuncA(LPCTSTR lpszParam) // 子线程中调用的函数
{
CString strRet;
OutputDebugStr(_T("Call FuncA Begin")); //............. OutputDebugStr(_T("Call FuncA End")); return strRet;
}
};出现以上那种情况时,看到“Call FuncA End”没有打印出来。
在大部分的计算机上运行是没有问题的,但是在个别机器上会出现这种情况。另:如果我在FuncA的核心代码前加上一个AfxMessageBox或者写一些信息到文件中,在那些异常的机器上也能看到Call FuncA End,结果也是正常的。
OutputDebugStr(_T("Call FuncA Begin")); //.............
你这中间是不是有代码段可以直接return啊?
OutputDebugStr(_T("Call FuncA End")); return strRet;
是不是FuncA 在OutputDebugStr(_T("Call FuncA End")); 这句之前return了呢?
(1)在主线程调用了退出线程的函数,比如:TerminateThread(hand);
(2)主线程退出;
(3)线程函数自己跳出;
(4)线程函数执行完毕。
你这个问题我觉得最主要的是你的主线程可能在子线程退出前就退出了。主线程退出前检查一下子线程是不是结束了。
线程返回正常值吗?
2.使用了terminalthread强制结束线程。
2.主线程挂了
3.代码中有未发现的返回 or 类似 if () ; return 这样的手误
4.代码不是异常安全的,最后输出函数前某个函数抛出了异常,而在外层 catch 了,导致流程直接跳过