写一个Windows(可扩展LINUX)下记录本地日志的类

 

#ifndef __LOG_THREAD_H__
#define __LOG_THREAD_H__

#include <deque>
#include <string>
#define CC_PLATFORM_WIN32   1
#define CC_TARGET_PLATFORM   CC_PLATFORM_WIN32

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
#include <Windows.h>
#endif

class LogThread
{
public:
 LogThread(const char* logFile);
 ~LogThread();

 void start();
 void stop();

 void addLog(const char* logText);
public://inner call back
 void excute();
private:
 std::deque<std::string> m_logs;
 bool m_bLoop;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
 FILE *m_pFile;
 HANDLE m_hThread;
#endif

 void myUsleep(unsigned int dwMillsecond);
 std::string getNowTime();
 void wirteLog(const std::string& logText, const std::string& theTime);
 void doLogOne();

};

#endif


#include "LogThread.h"


#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
DWORD WINAPI logThreadExcute(LPVOID lpParma)
{
 LogThread* t = (LogThread*)lpParma;
 t->excute();
 return 0;
}
#endif

LogThread::LogThread(const char* logFile) : m_bLoop(false)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
 m_pFile = fopen(logFile, "a+");
#endif

}

LogThread::~LogThread()
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
 fclose(m_pFile);
#endif
}

void LogThread::start()
{
 if (!m_bLoop)
 {
  m_bLoop = true;

  wirteLog("------------------------------------------------------------------", getNowTime());

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
  DWORD dwThreadID;
  m_hThread = CreateThread(NULL, 0, logThreadExcute, (LPVOID)this, 0, &dwThreadID);
#endif

 }
}

void LogThread::stop()
{
 m_bLoop = false;

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
 ::WaitForSingleObject(m_hThread, INFINITE);
#endif

 while(m_logs.size())
  doLogOne();
}

void LogThread::excute()
{
 while (m_bLoop)
 {
  doLogOne();
  myUsleep(10);
 }

 CloseHandle(m_hThread);
}

void LogThread::addLog(const char* logText)
{
 m_logs.push_back(logText);
}

void LogThread::myUsleep(unsigned int dwMillsecond)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
 Sleep(dwMillsecond);
#endif 
}

std::string LogThread::getNowTime()
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
 SYSTEMTIME sys;
 GetLocalTime( &sys );

 char buf[300] = {0x00};
 sprintf(buf, "%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n", sys.wYear,  sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);
 return buf;
#endif 
}

void LogThread::wirteLog(const std::string& logText, const std::string& theTime)
{
 char buf[1024] = {0x00};
 sprintf(buf, "%s    %s", logText.c_str(), theTime.c_str());
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
 fputs(buf, m_pFile);
 fflush(m_pFile);
#endif 
}

void LogThread::doLogOne()
{
 if (m_logs.size())
 {
  const std::string& str = m_logs.front();
  wirteLog(str, getNowTime());
  m_logs.pop_front();
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值