#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();
}
}