小弟起了40个线程,每个线程用GetTickCount()附一个唯一的标志符,但老是出问题,网上说给每个线程协一个日志,然后调试的时候查看日志就能确定错误的代码,但是具体不知道如何做,如何输出到日志,那位大侠具体指点下,不甚感激!

解决方案 »

  1.   

    写日志的意思是,把调试信息写入文件,方便查找
    给你一个写日志类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;
    }
      

  2.   

    log4cppGetCurrentThreadId获得当前线程的id