MFC多线程写log文件出现错误

代码如下:CCriticalSectiong_clsCriticalSection;UINTThreadProc10(LPVOIDpParam){g_clsCritica... 代码如下:

CCriticalSection g_clsCriticalSection;

UINT ThreadProc10(LPVOID pParam)
{
g_clsCriticalSection.Lock(); // 进入临界区

CString *strLogInfo=(CString*)pParam;
try
{
// Get the path of utility
CString strPath;
::GetModuleFileName( NULL, strPath.GetBuffer( MAX_PATH ), MAX_PATH );
strPath.ReleaseBuffer();
strPath = strPath.Left(strPath.ReverseFind(_T('\\')));
strPath += "\\utility.log";

// If the log doesn't exist, create firstly.
CStdioFile outFile(strPath, CFile::modeNoTruncate | CFile::modeCreate | CFile::modeWrite | CFile::typeText);
CString strData;
CTime tt = CTime::GetCurrentTime();
strData = tt.Format("[%Y-%B-%d %A, %H:%M:%S] ") + *strLogInfo;
strData += "\n";

outFile.SeekToEnd();
outFile.WriteString( strData );
outFile.Close();

}
catch(CFileException *fx)
{
fx->Delete();
}
//Sleep(1);
g_clsCriticalSection.Unlock(); // 离开临界区
return 0;
}

void Log::WriteLog(CString strLogInfo)
{
if(m_boolWriteLog)
{
AfxBeginThread(ThreadProc10, &strLogInfo);
}
}
程序运行时,发生crash了,求高手帮助。
展开
 我来答
匿名用户
2013-10-11
展开全部
代码Log::WriteLog(CString strLogInfo)里有一个严重的问题

你把栈临时变量的地址传入线程里运行了,由于线程运行又是异步的,即可能WriteLog函数返回了,线程还没开始运行,WriteLog返回后strLogInfo变量就被自动清理了,所以你传入线程里的参数其实是无效的,访问会出现崩溃;

有两种改法

1、使用new CString字符串,再传入线程里,然后线程里用完后delete释放

2、等待线程退出,但这样WriteLog函数就会卡住,一直等写操作完成才会退出

第一种改起来会简单很多,改成AfxBeginThread(ThreadProc10, new CString(strLogInfo));

然后在线程里delete strLogInfo就行了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式