现在的位置: 首页 > 综合 > 正文

无线承载(三)

2018年06月06日 ⁄ 综合 ⁄ 共 7713字 ⁄ 字号 评论关闭
/***********************
MyTrace.h
************************/

#pragma once
#include <afxstr.h>

/* 使用前需要定义类并设定类的宏属性SetMacroControl。 */

#define PRINT_LOG_NONE	0x00000000			//不开启
#define PRINT_LOG_ENDL	0x00000001			//开启换行
#define PRINT_LOG_TIME	0x00000011			//开启时间输出
#define PRINT_LOG_TRACE	0x00000101			//开启TRACE输出
#define PRINT_LOG_FILE	0x00001001			//开启文件输出
#define PRINT_IMPORTANT	0x00010001			//开启重要信息输出
#define PRINT_GENERAL	0x00100001			//开启普通信息输出
#define PRINT_WARNNING	0x01000001			//开启警告信息输出
#define PRINT_OTHER		0x10000001			//开启其他信息输出

//不换行
#define _PRINT_LOG_ENDL		0x00000000			//开启输出
#define _PRINT_LOG_TIME		0x00000010			//开启时间输出
#define _PRINT_LOG_TRACE	0x00000100			//开启TRACE输出
#define _PRINT_LOG_FILE		0x00001000			//开启文件输出

#define _PRINT_IMPORTANT	0x00010000			//开启重要信息输出
#define _PRINT_GENERAL		0x00100000			//开启普通信息输出
#define _PRINT_WARNNING		0x01000000			//开启警告信息输出
#define _PRINT_OTHER		0x10000000			//开启其他信息输出

#define IS_PRINT			0x11110000			//检测以上信息是否开启

//组合
#define X_PRINT_IMPORTANT	0x00011111			//输出重要
#define X_PRINT_GENERAL		0x00101111			//输出普通
#define X_PRINT_WARNNING	0x01001111			//输出警告
#define X_PRINT_OTHER		0x10001111			//输出其他

#define X_PRINT1			0x10011111			//
#define X_PRINT2			0x10111111			//
#define X_PRINT3			0x11111111			//

//宏定义编译时不进行类型检测
const int cX_PRINT_IMPORTANT	= X_PRINT_IMPORTANT;	//输出重要
const int cX_PRINT_GENERAL		= X_PRINT_GENERAL;		//输出普通
const int cX_PRINT_WARNNING		= X_PRINT_WARNNING;		//输出警告
const int cX_PRINT_OTHER		= X_PRINT_OTHER;		//输出其他

#define MAX_COUNT_FILE_OPEN		3
#define OUT_LOG_NAME	"run.log"

# define OPEN_MYTRACE

class MyTrace
{
public:
	MyTrace(void);
	~MyTrace(void);

private:
	CStringA m_strCurFilePath;	//当前程序运行路径
	CStringA m_strTraceName;		//数据文件名		
	HANDLE m_hWriteEvent;		//控制写信号量
	int m_nMacroControl;		//宏控制显示

private:
	CStringA GetAppDirectory();

public:
	CStringA CombineLineNumAndData(CStringA strData,int nLine);
	CStringA CombineFunctionNameAndData(CStringA strData,CStringA strFunctionName);


	void PrintLog(CStringA strData, int nMacroControl);
	void CleanLog();

	void SetMacroControl(int nMacroControl)		{	m_nMacroControl = nMacroControl;}
	
	void PrintImportantLog(CStringA strData)	{	strData = "[Important]" + strData;	PrintLog( strData, cX_PRINT_IMPORTANT);}
	void PrintGeneralLog(CStringA strData)		{	strData = "[General]" + strData;		PrintLog( strData, cX_PRINT_GENERAL);}
	void PrintWarnningLog(CStringA strData)		{	strData = "[Warnning]" + strData;		PrintLog( strData, cX_PRINT_WARNNING);}
	void PrintOtherLog(CStringA strData)		{	strData = "[Other]" + strData;		PrintLog( strData, cX_PRINT_OTHER);}
	
	
#if 1
	void PrintImportantLogAndLine(CStringA strData, int nLine)	{	strData = CombineLineNumAndData( strData, nLine);	PrintImportantLog( strData);}
	void PrintGeneralLogAndLine(CStringA strData, int nLine)	{	strData = CombineLineNumAndData( strData, nLine);	PrintGeneralLog( strData);}
	void PrintWarnningLogAndLine(CStringA strData, int nLine)	{	strData = CombineLineNumAndData( strData, nLine);	PrintWarnningLog( strData);}
	void PrintOtherLogAndLine(CStringA strData, int nLine)		{	strData = CombineLineNumAndData( strData, nLine);	PrintOtherLog( strData);}

	void PrintImportantLineFuncLog(CStringA strData, int nLine, CStringA strFunc)	{	strData = CombineFunctionNameAndData( strData, strFunc);	PrintImportantLogAndLine( strData, nLine);}
	void PrintGeneralLineFuncLog(CStringA strData, int nLine, CStringA strFunc)		{	strData = CombineFunctionNameAndData( strData, strFunc);	PrintGeneralLogAndLine( strData, nLine);}
	void PrintWarnningLineFuncLog(CStringA strData, int nLine, CStringA strFunc)	{	strData = CombineFunctionNameAndData( strData, strFunc);	PrintWarnningLogAndLine( strData, nLine);}
	void PrintOtherLineFuncLog(CStringA strData, int nLine, CStringA strFunc)		{	strData = CombineFunctionNameAndData( strData, strFunc);	PrintOtherLogAndLine( strData, nLine);}
#else
	
	void PrintImportantLogAndLine(CStringA strData)	{	strData = CombineLineNumAndData( strData, __LINE__);	PrintImportantLog( strData);}
	void PrintGeneralLogAndLine(CStringA strData)	{	strData = CombineLineNumAndData( strData, __LINE__);	PrintGeneralLog( strData);}
	void PrintWarnningLogAndLine(CStringA strData)	{	strData = CombineLineNumAndData( strData, __LINE__);	PrintWarnningLog( strData);}
	void PrintOtherLogAndLine(CStringA strData)		{	strData = CombineLineNumAndData( strData, __LINE__);	PrintOtherLog( strData);}

	void PrintImportantLineFuncLog(CStringA strData)	{	strData = CombineFunctionNameAndData( strData, __FUNCTION__);	PrintImportantLogAndLine( strData);}
	void PrintGeneralLineFuncLog(CStringA strData)		{	strData = CombineFunctionNameAndData( strData, __FUNCTION__);	PrintGeneralLogAndLine( strData);}
	void PrintWarnningLineFuncLog(CStringA strData)		{	strData = CombineFunctionNameAndData( strData, __FUNCTION__);	PrintWarnningLogAndLine( strData);}
	void PrintOtherLineFuncLog(CStringA strData)		{	strData = CombineFunctionNameAndData( strData, __FUNCTION__);	PrintOtherLogAndLine( strData);}

	void PrintImportantLineFuncLog()	{	CStringA strData = CombineFunctionNameAndData( "", __FUNCTION__);	PrintImportantLogAndLine( strData);}
	void PrintGeneralLineFuncLog()		{	CStringA strData = CombineFunctionNameAndData( "", __FUNCTION__);	PrintGeneralLogAndLine( strData);}
	void PrintWarnningLineFuncLog()		{	CStringA strData = CombineFunctionNameAndData( "", __FUNCTION__);	PrintWarnningLogAndLine( strData);}
	void PrintOtherLineFuncLog()		{	CStringA strData = CombineFunctionNameAndData( "", __FUNCTION__);	PrintOtherLogAndLine( strData);}
#endif
};


/***********************
MyTrace.cpp
************************/
#include "StdAfx.h"
#include "MyTrace.h"

#include <afx.h>


MyTrace::MyTrace(void)
{
	m_strCurFilePath= GetAppDirectory();
	m_strTraceName	= OUT_LOG_NAME;
	m_hWriteEvent	= CreateEvent(NULL, TRUE, TRUE, NULL);
	m_nMacroControl = X_PRINT1;
	if( m_hWriteEvent == NULL )
	{		
	}
}


MyTrace::~MyTrace(void)
{
	if( m_hWriteEvent )
	{
		CloseHandle( m_hWriteEvent );
		m_hWriteEvent	= NULL;
	}
}

/*
Func:组合行号与数据
*/
CStringA MyTrace::CombineLineNumAndData(CStringA strData,int nLine)
{
	CStringA strBuf;
	strBuf.Format("Line%d:%s",nLine,strData);
	return strBuf;
}

/*
Func:函数名与数据
*/
CStringA MyTrace::CombineFunctionNameAndData(CStringA strData,CStringA strFunctionName)
{
	strData = strFunctionName + ("\r\n") + strData;
	return strData;
}
/*
Func:获取当前程序运行路径\结尾
*/
CStringA MyTrace::GetAppDirectory()
{
	CStringA strCurFilePath;

#ifdef UNICODE
	TCHAR wszFileName[500] = {0};
	TCHAR *pFileName = wszFileName;
#else
	char szFileName[500]={0}; 
	char *pFileName = szFileName;
#endif

	HMODULE hModule = GetModuleHandle(0); 
	GetModuleFileName(hModule, pFileName, 500); 

	CStringA strTemp(pFileName);
	int nPos = strTemp.ReverseFind(_T('\\') ); 

	if(nPos>=0)
	{
		strCurFilePath = strTemp.Left(nPos);
		strCurFilePath += "\\";
	}

	return strCurFilePath;
}

/*
Func:log输出
*/
void MyTrace::PrintLog(CStringA strData,int nMacroControl)
{
	nMacroControl = nMacroControl & m_nMacroControl;
	if((nMacroControl & IS_PRINT )== PRINT_LOG_NONE)
		return;	

	if( strData.IsEmpty() )
	{
		return;
	}
	if( m_hWriteEvent == NULL )
	{
		return;
	}

	CStringA	strPrint = strData;
	strPrint	+= "\r\n";

	//开启Log输出
	if(strPrint.GetLength() < 512 &&( PRINT_LOG_TRACE ==( PRINT_LOG_TRACE & nMacroControl)))	
	{
		TRACE(strPrint);
	}
#if 0
	SYSTEMTIME	time;
	GetLocalTime(&time);
	CStringA	strTime;
	strTime.Format("%d%02d%02d\t%02d:%02d:%02d\t",time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);
	strPrint	= strTime + strPrint;
#endif
	//等待上一个写事件完成
	WaitForSingleObject( m_hWriteEvent, INFINITE );
	//重置信号,不允许写文件
	ResetEvent( m_hWriteEvent );	

	//输出数据到文件
	if(PRINT_LOG_FILE != (PRINT_LOG_FILE & nMacroControl))		//不输出到文件
		return;			

	CFile file;
	CFileException	ex;
#ifdef UNICODE
	CStringA strFilePathA = m_strCurFilePath + m_strTraceName;
	CString strFilePath(strFilePathA);
#else
	CString strFilePath = m_strCurFilePath + m_strTraceName;
#endif
	int	nCount	= 0;
	while( nCount < MAX_COUNT_FILE_OPEN )
	{
		if( !file.Open( strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate, &ex ) )
		{
			TCHAR	tch[1024];
			memset(tch,'\0',1024);
			ex.GetErrorMessage(tch,1024);
			TRACE(tch);
			TRACE(" Open file failure!!!!!!! \r\n");
		}
		else
		{
			file.SeekToEnd();
			file.Write(strPrint,strPrint.GetLength());
			file.Close();
			break;
		}
		nCount++;
		Sleep(1);
	}
	//设置信号,允许写文件
	SetEvent(m_hWriteEvent);	
}

/*
Func:获取当前程序运行路径\结尾
*/
void MyTrace::CleanLog()
{
#ifdef UNICODE
	CStringA strFilePathA = m_strCurFilePath + m_strTraceName;
	CString strFilePath(strFilePathA);
#else
	CString strFilePath = m_strCurFilePath + m_strTraceName;
#endif
	CFile	file;

	if( file.Open( (strFilePath), CFile::modeCreate, NULL))
	{
		file.Close();
	}
	else
	{
		TRACE(" Open File with create failure!!!!! \r\n");
	}
}

抱歉!评论已关闭.