多线程如何输出到日志 小弟起了40个线程,每个线程用GetTickCount()附一个唯一的标志符,但老是出问题,网上说给每个线程协一个日志,然后调试的时候查看日志就能确定错误的代码,但是具体不知道如何做,如何输出到日志,那位大侠具体指点下,不甚感激! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 写日志的意思是,把调试信息写入文件,方便查找给你一个写日志类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__)//#endifCLog* 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;} log4cppGetCurrentThreadId获得当前线程的id 二叉树节点数据读取出错,请求帮助 在enable时可以如下移动对话框(解决后220分) CSerialPort类如何将收到的数据全部读出来 对话框中用什么控件显示输出信息好? 必需的资源无法得到!!在线等 如何动态刷新硬盘分区?急 -------异常处理问题----- 窗体之间数据的传递问题? 关于动态创建的菜单项或按钮的消息印射如何实现解决? ActiveSkin与VC2010不兼容吗 如何往Outlook添加属性页(COM插件实现)? 集合s信息过滤构架中,要注意什么问题?不够一直加分
给你一个写日志类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__)
//#endifCLog* 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;
}