📄 infomationreport.cpp
字号:
// InfomationReport.cpp: implementation of the CInfoReport class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "WriteInfo.h"
#include "InfomationReport.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// 因为是static member,所以要在此声明
CPtrList CInfoReport::m_lstpThreads;
DWORD CInfoReport::m_dwFatalErrThrdID;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CInfoReport::CInfoReport()
{
}
CInfoReport::~CInfoReport()
{
}
//////////////////////////////////////////////////////////////////
// 功能函数
//////////////////////////////////////////////////////////////////
//
// FUNCTION: DWORD Register(LPCTSTR ModuleNameToReg)
//
// PURPOSE: 根据传入的模块名返回一个ID为调用WriteInfo()作准备
//
// PARAMETERS:
// MoudleNameToReg: 用来获取ID的模块名称。
//
// RETURN VALUE:
// DWORD类型,实际上是所分配线程在lstpThreads链表中的存储位置。
//
// COMMENTS:
//
// 当需要日志记录时,需要用该函数取得一个ID来调用WriteInfo()。
// 该函数给出一个新的ID意味着为调用它的模块产生了一个新的日志记录线程。
//
DWORD CInfoReport::Register(LPCTSTR ModuleNameToReg)
{
CWriteInfo *pWriteInfo = NULL;
POSITION pos, posPrev;
// 首先要起动一个维护FatalErr.log的线程
if(m_lstpThreads.IsEmpty())
{
CString strFatalErr = "FatalErr.log";
// 为每一个需要注册的模块创建操作对应文件的线程
pWriteInfo = (CWriteInfo*)::AfxBeginThread(RUNTIME_CLASS(CWriteInfo),0,
0,CREATE_SUSPENDED);
pWriteInfo->SetModuleFileName(strFatalErr);
m_dwFatalErrThrdID = (DWORD)m_lstpThreads.AddTail(pWriteInfo);
pWriteInfo->ResumeThread();
}
// 当遇到在一个模块内重复调用该函数这种情况时仍然返回原有的ID即对应线程在
// m_lstpThreads中的position即可
pos = m_lstpThreads.GetHeadPosition();
while(pos)
{
posPrev = pos;
pWriteInfo = (CWriteInfo*)m_lstpThreads.GetNext(pos);
if(0 == pWriteInfo->GetName().CompareNoCase(ModuleNameToReg))
{
return (DWORD)posPrev;
}
}
// 为每一个需要注册的模块创建或者打开操作对应的文件
{
}
// 为每一个需要注册的模块创建操作对应文件的线程
pWriteInfo = (CWriteInfo*)::AfxBeginThread(RUNTIME_CLASS(CWriteInfo),0,0,
CREATE_SUSPENDED);
pWriteInfo->SetModuleFileName(ModuleNameToReg);
pos = m_lstpThreads.AddTail(pWriteInfo);
pWriteInfo->ResumeThread();
return (DWORD)pos;
}
//////////////////////////////////////////////////////////////////
// 功能函数
//////////////////////////////////////////////////////////////////
//
// FUNCTION: void WriteInfo(DWORD MoudleID, CString InfoDescribe)
//
// PURPOSE: 将提供的信息写入到对应的日志文件中。
//
// PARAMETERS:
// MoudleID: 用Register()函数获取来的模块ID,如果以NULL作为MoudleID来调
// 用此函数,那就意味着发生了致命错误,信息将被写入到FatalErr.log
// 文件中。
// InfoDescribe: 需要记录的信息
//
// RETURN VALUE:
// N/A
//
// COMMENTS:
//
// 用该函数写入日志信息。
//
void CInfoReport::WriteInfo(DWORD MoudleID, CString InfoDescribe)
{
/* // 如果以NULL作为MoudleID来调用此函数,那就意味着发生了致命错误.
if(MoudleID == NULL)
MoudleID = m_dwFatalErrThrdID;
*/
ASSERT(MoudleID != NULL);
CWriteInfo *pWriteInfo = (CWriteInfo*)m_lstpThreads.GetAt(
(POSITION)MoudleID);
int len = InfoDescribe.GetLength();
// 此处重新拷贝信息,new出的内存在TM_WRITE_INFO的消息处理函数中释放。
char* pChar = new char[len];
memcpy(pChar,InfoDescribe,len);
// 用消息的方式同志对用线程进行处理,
// wParam: 要写入的内容指针,类型为char*
// lParam: 要写入的内容的长度
::PostThreadMessage(pWriteInfo->m_nThreadID, TM_WRITE_INFO, (WPARAM)pChar,
len);
}
//////////////////////////////////////////////////////////////////
// 功能函数
//////////////////////////////////////////////////////////////////
//
// FUNCTION: void WriteInfo(DWORD MoudleID, CString InfoFrom, CString InfoDescribe)
//
// PURPOSE: 将提供的信息写入到对应的日志文件中。
//
// PARAMETERS:
// MoudleID: 用Register()函数获取来的模块ID,如果以NULL作为MoudleID来调
// 用此函数,那就意味着发生了致命错误,信息将被写入到FatalErr.log
// 文件中。
// InfoFrom: 信息来源, 模块实例的名称,如网元实例名。
// InfoDescribe: 需要记录的信息
//
// RETURN VALUE:
// N/A
//
// COMMENTS:
//
// 同void WriteInfo(DWORD MoudleID, CString InfoDescribe), 用该函数写入日
// 志信息。
//
void CInfoReport::WriteInfo(DWORD MoudleID,
CString InfoFrom,
CString InfoDescribe)
{
// 如果以NULL作为MoudleID来调用此函数,那就意味着发生了致命错误.
if(MoudleID == NULL)
MoudleID = m_dwFatalErrThrdID;
CWriteInfo *pWriteInfo = (CWriteInfo*)m_lstpThreads.GetAt(
(POSITION)MoudleID);
int len = 5/*sizeof("From ")*/ + InfoFrom.GetLength() + 3/*sizeof(" : ")*/
+ InfoDescribe.GetLength();
// 此处重新拷贝信息,new出的内存在TM_WRITE_INFO的消息处理函数中释放。
char* pChar = new char[len];
memcpy(pChar,"From ",5);
memcpy(pChar + 5, InfoFrom, InfoFrom.GetLength());
memcpy(pChar + 5 + InfoFrom.GetLength(), " : ",3);
memcpy(pChar + 5 + InfoFrom.GetLength() + 3,InfoDescribe,
InfoDescribe.GetLength());
// 用消息的方式同志对用线程进行处理,
// wParam: 要写入的内容指针,类型为char*
// lParam: 要写入的内容的长度
::PostThreadMessage(pWriteInfo->m_nThreadID, TM_WRITE_INFO, (WPARAM)pChar,
len);
}
void CInfoReport::WriteInfo(DWORD dwMoudleID,CString strUser,
CString strAction,CString strTarget)
{
CString InfoDescribe;
InfoDescribe= strUser +" "+strAction+" "+strTarget;
WriteInfo(dwMoudleID, InfoDescribe);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -