首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

dll 写日记 互斥同步无效

2013-01-11 
dll 写日志 互斥同步无效dll 被加载到不同的进程中,日志文件是同一个用互斥量 进行同步,结果是无法同步,日

dll 写日志 互斥同步无效
dll 被加载到不同的进程中,日志文件是同一个
用互斥量 进行同步,结果是无法同步,日志信息总是会相互覆盖


CMutex g_Mutex(FALSE,_T("Mutex1"));
/*
 * 日志初始化
 */
void LogInit()
{
if (g_logFile.Open(g_strAppPath + _T("\\ABPlugin_log.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::shareDenyNone))
{
ULONGLONG len = g_logFile.GetLength();
if (len >= 10000000)
{
char *buf = (char *)malloc(65536);
UINT bufLen = g_logFile.Read(buf, 65536);

g_logFile.Close();

if (g_logFile.Open(g_strAppPath + _T("\\ABPlugin_log.txt"), CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone))
{
g_logFile.Write("\xFF\xFE", 2);
if (bufLen > 0)
{
g_logFile.Write(buf, bufLen);
}
}

free(buf);
}
else
{
if (len == 0)
{
g_logFile.Write("\xFF\xFE", 2);
}

g_logFile.SeekToEnd();
}
}
}

/*
 * 消息日志
 * @param t_fileName: 文件名
 * @param t_line: 行号
 * @param t_log: 日志信息
 */
void LogInfo(const TCHAR *t_fileName, unsigned long t_line, const TCHAR *t_log)
{
if (t_log == NULL)
{
return;
}
g_Mutex.Lock();

if (g_logFile.m_hFile != CFile::hFileNull)
{
CString logStr;
CTime ctm = CTime::GetCurrentTime();

logStr.Format(_T("info  %04d-%02d-%02d %02d:%02d:%02d "), 
ctm.GetYear(), ctm.GetMonth(), ctm.GetDay(), ctm.GetHour(), ctm.GetMinute(), ctm.GetSecond());

g_logFile.Write(logStr, logStr.GetLength() * sizeof(TCHAR));

g_logFile.Write(t_log, _tcslen(t_log) * sizeof(TCHAR));
}
g_Mutex.Unlock();
}


LogInit()接口在dll的BOOL CABPluginApp::InitInstance() 里调用初始化


[解决办法]
互斥的时候,文件已经打开了,所记载的当前长度位置没有更新。你试着每次写的时候,加锁,打开文件,写完关闭文件,放锁,这样看看。
[解决办法]
Write完了,Flush一下,防止缓冲
[解决办法]
用“独占方式”打开文件。
[解决办法]
多线程调用了LogInfo?   
[解决办法]
那你DLL初始化几次啊?重复初始化的话,就肯定如你描述的情况了。
[解决办法]
LogInit()接口在dll的BOOL CABPluginApp::InitInstance() 里调用初始化
你的DLL是什么类型,怎么有InitInstance(),应该导出一个初始化接口,在应用程序APP中初始化DLL,或者在DLL中设置一个标志,在接口实现中判断是否初始化,没有就调用初始化

热点排行