mirror of
https://github.com/duilib/duilib.git
synced 2026-10-16 21:51:33 +08:00
467cab8148
Duilib暂不会有新特性增加,但已经准备一段时间修改代码目录管理结构,重构Demo 闲置半年多未更新一方面忙于生计,也源于提高内功 感谢Duilib原作者同意迁移SVN官方地址,便于社区维护 最后特别感谢【Duilib官方交流群3】活跃开发者们的帮助指导,为Duilib的重构提供了很多帮助,也为我个人成长提供指导
249 lines
6.4 KiB
C++
249 lines
6.4 KiB
C++
//
|
|
// debug.cpp
|
|
// ~~~~~~~~~
|
|
//
|
|
// Copyright (c) 2011 achellies (achellies at 163 dot com)
|
|
//
|
|
// This code may be used in compiled form in any way you desire. This
|
|
// source file may be redistributed by any means PROVIDING it is
|
|
// not sold for profit without the authors written consent, and
|
|
// providing that this notice and the authors name is included.
|
|
//
|
|
// This file is provided "as is" with no expressed or implied warranty.
|
|
// The author accepts no liability if it causes any damage to you or your
|
|
// computer whatsoever. It's free, so don't hassle me about it.
|
|
//
|
|
// Beware of bugs.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "debug.hpp"
|
|
#include <winbase.h>
|
|
|
|
#if defined(DBG_THREADSAFE)
|
|
|
|
class OS_CLockable
|
|
{
|
|
public:
|
|
// ## Constructor / Destructor
|
|
OS_CLockable();
|
|
~OS_CLockable();
|
|
|
|
// ....................................................................
|
|
// METHOD NAME: Acquire
|
|
// DESCRIPTION:
|
|
// Acquires a lock, blocking.
|
|
// PARAMETERS:
|
|
// none
|
|
// RETURN VALUE:
|
|
// none
|
|
// ....................................................................
|
|
void Acquire();
|
|
|
|
// ....................................................................
|
|
// METHOD NAME: Release
|
|
// DESCRIPTION:
|
|
// Releases the lock.
|
|
// object.
|
|
// PARAMETERS:
|
|
// none
|
|
// RETURN VALUE:
|
|
// none
|
|
// ....................................................................
|
|
void Release();
|
|
|
|
private:
|
|
DWORD dwVersion;
|
|
DWORD dwWindowsMajorVersion;
|
|
DWORD dwWindowsMinorVersion;
|
|
// ## Instance Variables
|
|
|
|
CRITICAL_SECTION m_critSec;
|
|
|
|
// ## declarations with no implementations (prevent accidental use)
|
|
|
|
OS_CLockable (const OS_CLockable&);
|
|
OS_CLockable& operator= (const OS_CLockable&);
|
|
};
|
|
|
|
// ............................................................................
|
|
// CLASS NAME: OS_CAutoLock
|
|
//
|
|
// RESPONSIBILITIES:
|
|
// Provides automatic locking and unlocking of an OS_CLockable object
|
|
// within a code scope.
|
|
//
|
|
// NOTES:
|
|
// ............................................................................
|
|
class OS_CAutoLock
|
|
{
|
|
public:
|
|
|
|
// ## Constructors
|
|
OS_CAutoLock(OS_CLockable &lockable) : m_lockable(lockable)
|
|
{lockable.Acquire(); };
|
|
|
|
// ## Destructor
|
|
~OS_CAutoLock() { m_lockable.Release();};
|
|
|
|
private:
|
|
|
|
// The controlled lockable object
|
|
OS_CLockable &m_lockable;
|
|
|
|
// ## declarations with no implementations (prevent accidental use)
|
|
|
|
OS_CAutoLock ();
|
|
OS_CAutoLock (const OS_CAutoLock&);
|
|
OS_CAutoLock& operator= (const OS_CAutoLock&);
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// OS_CLockable METHOD DEFINITIONS
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// ...........................................................................
|
|
//
|
|
// NAME: OS_CLockable::OS_CLockable (Constructor)
|
|
//
|
|
// IMPLEMENTATION NOTES:
|
|
// ...........................................................................
|
|
OS_CLockable::OS_CLockable()
|
|
{
|
|
OSVERSIONINFO osvi = {0};
|
|
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
GetVersionEx(&osvi);
|
|
dwWindowsMajorVersion = osvi.dwMajorVersion;
|
|
dwWindowsMinorVersion = osvi.dwMinorVersion;
|
|
if(dwWindowsMajorVersion < 6)
|
|
::InitializeCriticalSection(&m_critSec);
|
|
|
|
return;
|
|
}
|
|
|
|
// ...........................................................................
|
|
//
|
|
// NAME: OS_CLockable::~OS_CLockable (Destructor)
|
|
//
|
|
// IMPLEMENTATION NOTES:
|
|
// ...........................................................................
|
|
OS_CLockable::~OS_CLockable()
|
|
{
|
|
if(dwWindowsMajorVersion < 6)
|
|
::DeleteCriticalSection(&m_critSec);
|
|
|
|
return;
|
|
}
|
|
|
|
// ...........................................................................
|
|
//
|
|
// NAME: OS_CLockable::Acquire
|
|
//
|
|
// IMPLEMENTATION NOTES:
|
|
// ...........................................................................
|
|
void OS_CLockable::Acquire()
|
|
{
|
|
if(dwWindowsMajorVersion < 6)
|
|
::EnterCriticalSection(&m_critSec);
|
|
}
|
|
|
|
// ...........................................................................
|
|
//
|
|
// NAME: OS_CLockable::Release
|
|
//
|
|
// IMPLEMENTATION NOTES:
|
|
// ...........................................................................
|
|
void OS_CLockable::Release()
|
|
{
|
|
if(dwWindowsMajorVersion < 6)
|
|
::LeaveCriticalSection(&m_critSec);
|
|
}
|
|
#endif
|
|
|
|
#define MAX_LOG_FILE_SIZE static_cast<int>(1024*1024/2)
|
|
|
|
#ifdef _DEBUG
|
|
int g_iDebugLevel = DBG_VERBOSE;
|
|
#else
|
|
int g_iDebugLevel = DBG_ERROR;
|
|
#endif
|
|
|
|
bool g_bSaveLogFile = false;
|
|
|
|
TCHAR g_bLogSavePath[MAX_PATH] = _T("C:\\log");
|
|
|
|
static TCHAR s_szLogFile[MAX_PATH] = {0};
|
|
static bool s_bLogPathInit = false;
|
|
|
|
#if defined(DBG_THREADSAFE)
|
|
static OS_CLockable s_mtxEntry;
|
|
#endif
|
|
|
|
BOOL DbgPrint(__in LPCTSTR lpszFormatString, ...)
|
|
{
|
|
BOOL bResult = TRUE;
|
|
|
|
va_list VAList;
|
|
va_start(VAList, lpszFormatString);
|
|
|
|
if (g_bSaveLogFile)
|
|
{
|
|
#if defined(DBG_THREADSAFE)
|
|
OS_CAutoLock lock(s_mtxEntry);
|
|
#endif
|
|
if (!s_bLogPathInit)
|
|
{
|
|
SYSTEMTIME stime = {0};
|
|
GetLocalTime(&stime);
|
|
#if defined(UNDER_CE)
|
|
_stprintf(s_szLogFile, _T("%s\\log_%04d%02d%02d_%d.log"), g_bLogSavePath, stime.wYear, stime.wMonth, stime.wDay, GetTickCount());
|
|
#else
|
|
_stprintf_s(s_szLogFile, MAX_PATH, _T("%s\\log_%04d%02d%02d_%d.log"), g_bLogSavePath, stime.wYear, stime.wMonth, stime.wDay, GetTickCount());
|
|
#endif
|
|
s_bLogPathInit = true;
|
|
}
|
|
|
|
FILE* pFile = _tfopen(s_szLogFile, _T("a"));
|
|
if (pFile != NULL)
|
|
{
|
|
fseek(pFile,SEEK_END,0);
|
|
long cbSize = ftell(pFile);
|
|
if (cbSize > MAX_LOG_FILE_SIZE)
|
|
{
|
|
fclose(pFile);
|
|
{
|
|
SYSTEMTIME stime = {0};
|
|
GetLocalTime(&stime);
|
|
#if defined(UNDER_CE)
|
|
_stprintf(s_szLogFile, _T("%s\\log_%04d%02d%02d_%d.log"), g_bLogSavePath, stime.wYear, stime.wMonth, stime.wDay, GetTickCount());
|
|
#else
|
|
_stprintf_s(s_szLogFile, MAX_PATH, _T("%s\\log_%04d%02d%02d_%d.log"), g_bLogSavePath, stime.wYear, stime.wMonth, stime.wDay, GetTickCount());
|
|
#endif
|
|
s_bLogPathInit = true;
|
|
}
|
|
pFile = _tfopen(s_szLogFile, _T("a"));
|
|
if (pFile == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
_vftprintf(pFile, lpszFormatString, VAList);
|
|
fflush(pFile);
|
|
fclose(pFile);
|
|
pFile = NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
#if defined(UNDER_CE)
|
|
_vtprintf(lpszFormatString, VAList);
|
|
#else
|
|
TCHAR szBuf[MAX_PATH * 2] = {0};
|
|
_vstprintf_s(szBuf, MAX_PATH, lpszFormatString, VAList);
|
|
OutputDebugString(szBuf);
|
|
#endif
|
|
}
|
|
va_end(VAList);
|
|
|
|
return bResult;
|
|
} |