多线程如何输出到日志

syl04035102 2008-04-09 11:29:49
小弟起了40个线程,每个线程用GetTickCount()附一个唯一的标志符,但老是出问题,网上说给每个线程协一个日志,然后调试的时候查看日志就能确定错误的代码,但是具体不知道如何做,如何输出到日志,那位大侠具体指点下,不甚感激!
...全文
567 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Torch009 2008-04-09
  • 打赏
  • 举报
回复
有了线程ID就好办了。
ouyh12345 2008-04-09
  • 打赏
  • 举报
回复
log4cpp

GetCurrentThreadId获得当前线程的id
iGoo 2008-04-09
  • 打赏
  • 举报
回复
写日志的意思是,把调试信息写入文件,方便查找
给你一个写日志类

log.h

#include <windows.h>
#include <fstream>

class CSynObj
{
public:
CSynObj()
{
InitializeCriticalSection(&m_cs);
}

~CSynObj()
{
DeleteCriticalSection(&m_cs);
}

void Lock()
{
EnterCriticalSection(&m_cs);
}

void UnLock()
{
LeaveCriticalSection(&m_cs);

}

private:
CRITICAL_SECTION m_cs;
};

class CLock
{
public:
CLock(CSynObj& synchobject)
:refSynchObject(synchobject)
{
refSynchObject.Lock();
}

virtual ~CLock()
{
refSynchObject.UnLock();
}

protected:
CSynObj& refSynchObject;
};

enum LOG_TARGET_E
{
LOG_TARGET_SCREEN = 1,
LOG_TARGET_FILE = 2,
};


class CLog
{
private:

~CLog();

CLog();

CLog(const CLog& rhs) {}

CLog& operator = (const CLog& rhs) {}

static CLog* m_pLog;

static CSynObj m_Lock;

std::ofstream m_OutFile;

void GetSysTime(SYSTEMTIME* lpSysTime);

void FormatAllTime(const SYSTEMTIME& refSysTime, std::string& strOut);

public:

void Write(char* pMsg, int nTarget);

static CLog* GetInstance();

// 摧毁singleton的入口
static void DestroyInstance();
};

__inline void DEBUG_MSG(LPSTR filename, int lineno, LPSTR linedesc, DWORD dwErrCode, int nOutPutTarget = LOG_TARGET_SCREEN|LOG_TARGET_FILE)
{
char cTemp[256];
sprintf( cTemp, "%lu error on %d line in %s file: %s", dwErrCode, lineno, filename, linedesc );
CLog* pLog = CLog::GetInstance();
pLog->Write( cTemp, nOutPutTarget );
}



log.cpp

#include "Log.h"
#include <iostream>

//#ifdef _DEBUG
//#define _CRTDBG_MAP_ALLOC
//#include <stdlib.h>
//#include "crtdbg.h"
//#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
//#endif

CLog* CLog::m_pLog = NULL;
CSynObj CLog::m_Lock;

CLog::~CLog()
{
m_OutFile.close();
}

CLog::CLog()
{
m_OutFile.open( "netdug.txt", std::ios::app );
atexit( CLog::DestroyInstance );
}

void CLog::GetSysTime(SYSTEMTIME* lpSysTime)
{
//获得系统时间
FILETIME CurFileTime;
::GetSystemTimeAsFileTime(&CurFileTime);
::FileTimeToLocalFileTime(&CurFileTime, &CurFileTime);
::FileTimeToSystemTime(&CurFileTime, lpSysTime);
}

void CLog::FormatAllTime(const SYSTEMTIME& refSysTime, std::string& strOut)
{
//系统时间转换成字符串
char cBuffer[MAX_PATH*2];
sprintf(cBuffer,"%d-%02d-%02d %02d:%02d:%02d",
refSysTime.wYear, refSysTime.wMonth, refSysTime.wDay , refSysTime.wHour , refSysTime.wMinute , refSysTime.wSecond);
strOut = cBuffer;
}


void CLog::Write(char* pMsg, int nTarget)
{
CLock Lock( CLog::m_Lock );
SYSTEMTIME Systime;
std::string strTime;
GetSysTime( &Systime );
FormatAllTime( Systime, strTime );
if( nTarget & LOG_TARGET_FILE )
m_OutFile << strTime.c_str() << ": " << pMsg << std::endl;
if( nTarget & LOG_TARGET_SCREEN )
std::cout << pMsg << std::endl;
}


CLog* CLog::GetInstance()
{
// 为提高效率,执行双次检测
if( !m_pLog )
{
CLock Lock( CLog::m_Lock );
if( !m_pLog )
m_pLog = new CLog;
}
return m_pLog;
}


void CLog::DestroyInstance()
{
delete m_pLog;
m_pLog = NULL;
}
syl04035102 2008-04-09
  • 打赏
  • 举报
回复
呀,分给错了
syl04035102 2008-04-09
  • 打赏
  • 举报
回复
谢谢楼上
scq2099yt 2008-04-09
  • 打赏
  • 举报
回复
up

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧