WEB开发网
开发学院手机开发Windows Mobile 开发 Windows Mobile 下使用 Native C++ 开发日志类 阅读

Windows Mobile 下使用 Native C++ 开发日志类

 2010-02-24 20:01:00 来源:WEB开发网   
核心提示:std::string& strFilePath){ m_strFilePath = strFilePath; Dispose(); Initialise();}void Logger::SetLogLevel( const LOG_LEVEL enLogLevel){ m_enLogLevel = enLogLeve
std::string& strFilePath){ m_strFilePath = strFilePath; Dispose(); Initialise();}void Logger::SetLogLevel( const LOG_LEVEL enLogLevel){ m_enLogLevel = enLogLevel;}Logger::Logger(){ Initialise();}//never useLogger::~Logger(){ Dispose();}void Logger::Initialise(){ if( m_strFilePath.length() > 0 ) { m_hLogFile = fopen(m_strFilePath.c_str(), "a+"); }}void Logger::Dispose(){ if( NULL != m_hLogFile ) { fflush( m_hLogFile ); fclose( m_hLogFile ); m_hLogFile = NULL; }}void Logger::Log( LOG_LEVEL enLogLevel ,const TCHAR *format, ... ){ if( m_enLogLevel > enLogLevel) { return; }#ifndef DEBUG if ( NULL == m_hLogFile ) { return; }#endif TCHAR szBuffer[1024]; va_list args; va_start(args, format); vswprintf(szBuffer, format, args); va_end(args);#ifdef DEBUG wprintf(_T("%S THR:%8.8x %s %s "), GetCurrentTime(), GetCurrentThread(), LogLevelStr[enLogLevel], szBuffer);#else //combine time stamp, thread number and log level together. if( 0 > fwprintf(m_hLogFile, _T("%S THR:%8.8x %s %s "), GetCurrentTime(), GetCurrentThreadId(), LogLevelStr[enLogLevel], szBuffer) ) { Dispose(); } else { fflush(m_hLogFile); }#endif }

Singleton模式

这个Logger类使用Singleton模式来实现,不知道什么时候开始博客园已经不再流行设计模式了,一方面说明设计模式不再是阳春白雪,已经深入人间。另一方面又兴起了反模式热潮。在反模式的风潮中,Singleton是给人批评最多的模式,Singleton有点像变相的全局变量,破坏了封装,混乱了各个类的依赖关系。

我还是那句话,模式本身没有错,看用的人是否把特定的模式用在特定的场景下。Singleton我还是会用到,如果某个资源类有且只有一份,我就使用Singleton。没有必要产生多个对象,而且多个对象访问独占资源会有同步问题。在Logger类,我还是使用Singleton,因为我只写一个文件。

Singleton的具体实现一般关心三个问题: 1. 有且只有一个对象实例化。 2.多线程的控制。其实第二个问题也是为了保证第一个问题。3. 按需实例化。

private: /* more (non-static) functions here */ Logger(); // ctor hidden Logger(Logger const&); // copy ctor hidden Logger& operator=(Logger

上一页  1 2 3 4  下一页

Tags:Windows Mobile 使用

编辑录入:coldstar [复制链接] [打 印]
赞助商链接