|
在外部调用LogCreate,后再调用LogRun,出现代码无法执行到 svc();涵数里,请问我该如何改?
我是初学者,各位对代码要求不要太高。我现在只问为什么我的线程无法执行到,谢谢各位!
DLL对外接口:
#include "stdafx.h"
#include "xfLog.h"
#include "LOG.h"
CLOG* Logfactory;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
Logfactory = new(std::nothrow)CLOG;
if (Logfactory == NULL)
{
return 1;
}
}
break;
case DLL_PROCESS_DETACH:
{
if (Logfactory == NULL)
{
delete Logfactory;
Logfactory = NULL;
}
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
//初始化日志
int XFLOG_API _stdcall LogCreate(void)
{
Logfactory->InitLog();
return 0;
}
//释放日志
int XFLOG_API _stdcall LogFree(void)
{
Logfactory->UnInitLog();
return 0;
}
//设置连接数据库参数
void XFLOG_API _stdcall LogSetDBparam(char* DNS,
char* uName,
char* uPass)
{
Logfactory->setDBparam(DNS,uName,uPass);
}
//运行日志记录
void XFLOG_API _stdcall LogRun(void)
{
Logfactory->RunLog();
}
//日志记录
void XFLOG_API _stdcall LogWrite(int iSysModule,
int iModule,
int iType,
char* cContnet)
{
Logfactory->write(iSysModule,iModule,iType,cContnet);
}
调用类:
#ifndef _DLL_LOG_H_
#define _DLL_LOG_H_
#pragma once
#include "xfLogpub.h"
class CLOG: public ACE_Task<ACE_MT_SYNCH>
{
private:
//数据库连接参数
stDBparam* DBparam;
//日志消息保存保列
TMessageQueue* m_Log;
//退出线程标志位
bool ThreadExitState;
//将日志记录写入队列的互斥
ACE_Thread_Mutex* m_LogMutex;
//文件操作变量
FILE* filefp;
char* FilePath;
public:
CLOG(void);
virtual ~CLOG(void);
private:
//写入文本文件
void writeTxt(const stLogInfo* LogInfo);
//写入数据库
void writeDB(const stLogInfo* LogInfo);
// 打开线程服务
int open ();
// 关闭线程服务
int close ();
//线程执行主方法,
int svc();
/********************************************************
功能说明:释放线程数据前,检查日志队列中的数据是否处理完
入参说明:无
返回结果:0 全部处理完
1 未处理完
********************************************************/
int check();
public:
/********************************************************
功能说明:初始化线程数据
入参说明:无
返回结果:0 成功
1 失败
********************************************************/
int InitLog();
/********************************************************
功能说明:日志正式开始运行
入参说明:无
返回结果:无
********************************************************/
void RunLog();
/********************************************************
功能说明:释放线程数据
入参说明:无
返回结果:无
********************************************************/
void UnInitLog();
/********************************************************
功能说明:设置数据连接参数
入参说明:DNS 服务器名
uName 用户名
uPass 密码
返回结果:无
********************************************************/
void setDBparam(char* DNS,
char* uName,
char* uPass);
/********************************************************
功能说明:记录日志
入参说明:iSysModule 平台类型(参见xfLogpub.h)
iModule 模块类型(参见xfLogpub.h)
iType 日志类型(参见xfLogpub.h)
cContnet 日志记录信息
返回结果:无
********************************************************/
void write(int iSysModule,
int iModule,
int iType,
char* cContnet);
};
#endif;
类实现:
#include "StdAfx.h"
#include ".\log.h"
CLOG::CLOG(void)
{
}
CLOG::~CLOG(void)
{
}
// 打开线程服务
int CLOG::open()
{
this->activate(); //(THR_NEW_LWP,1);
return 0;
}
// 关闭线程服务
int CLOG::close()
{
return 0;
}
//线程执行主方法,
int CLOG::svc()
{
while (this->ThreadExitState == false)
{
//循环日志队列进行保存
while (this->m_Log->is_empty() != (int) true)
{
ACE_Message_Block* message_block = NULL;
stLogInfo* LogInfo = NULL;
//取出数据
if(this->m_Log->dequeue(message_block) != -1)
{
LogInfo = (stLogInfo*)message_block->rd_ptr();
//写入TXT文件
writeTxt(LogInfo);
//写入数据库
writeDB(LogInfo);
//释放
message_block->release();
}
if (message_block != NULL)
{
delete message_block;
message_block = NULL;
}
if (LogInfo != NULL)
{
delete LogInfo;
LogInfo = NULL;
}
}
ACE_OS::sleep(ACE_Time_Value( 0, 5000 ));
}
return 0;
}
/********************************************************
功能说明:初始化线程数据
入参说明:无
返回结果:0 成功
1 失败
********************************************************/
int CLOG::InitLog()
{
this->ThreadExitState = false;
this->m_Log = new(std::nothrow) TMessageQueue;
if (this->m_Log == NULL)
{
return OPERATION_FAILED;
}
this->DBparam = new(std::nothrow)stDBparam;
if (this->DBparam == NULL)
{
return OPERATION_FAILED;
}
this->m_LogMutex = new(std::nothrow)ACE_Thread_Mutex;
if (this->m_LogMutex == NULL)
{
return OPERATION_FAILED;
}
//文件创建
FilePath = new char[250];
ACE_OS::memset(FilePath,0,250);
ACE_OS::getcwd(FilePath,250);
filefp = new(std::nothrow)FILE;
if (filefp == NULL)
{
return OPERATION_FAILED;
}
return OPERATION_SUCCESS;
}
/********************************************************
功能说明:释放线程数据
入参说明:无
返回结果:无
********************************************************/
void CLOG::UnInitLog()
{
while (true)
{
if (check() == OPERATION_SUCCESS)
{
break;
}
ACE_OS::sleep(ACE_Time_Value( 0, 5000 ));
}
if (this->DBparam != NULL)
{
delete this->DBparam;
this->DBparam = NULL;
}
if (this->m_Log != NULL)
{
delete this->m_Log;
this->m_Log = NULL;
}
if (this->m_LogMutex != NULL)
{
delete this->m_LogMutex;
this->m_LogMutex = NULL;
}
}
/********************************************************
功能说明:释放线程数据前,检查日志队列中的数据是否处理完
入参说明:无
返回结果:0 全部处理完
1 未处理完
********************************************************/
int CLOG::check()
{
if (this->m_Log->is_empty() == (int)true)
{
this->ThreadExitState = true;
return OPERATION_SUCCESS;
}
else
{
return OPERATION_FAILED;
}
}
/********************************************************
功能说明:日志正式开始运行
入参说明:无
返回结果:无
********************************************************/
void CLOG::RunLog()
{
this->open();
}
/********************************************************
功能说明:设置数据连接参数
入参说明:DNS 服务器名
uName 用户名
uPass 密码
返回结果:无
********************************************************/
void CLOG::setDBparam(char* DNS,
char* uName,
char* uPass)
{
DBparam->cDNS = DNS;
DBparam->cName = uName;
DBparam->cPass = uPass;
DBparam->cPass = uPass;
}
/********************************************************
功能说明:记录日志
入参说明:iSysModule 平台类型(参见xfLogpub.h)
iModule 模块类型(参见xfLogpub.h)
iType 日志类型(参见xfLogpub.h)
cContnet 日志记录信息
返回结果:无
********************************************************/
void CLOG::write(int iSysModule,
int iModule,
int iType,
char* cContnet)
{
m_LogMutex->acquire();
stLogInfo* LogInfo;
LogInfo = new(std::nothrow)stLogInfo;
if (LogInfo != NULL)
{
ACE_OS::memset(LogInfo,0,sizeof(stLogInfo));
ACE_Message_Block *m_MsgBlock =new(std::nothrow) ACE_Message_Block((char *)LogInfo,sizeof(stLogInfo));
if (m_MsgBlock != NULL)
{
//组合数据,压入队列
LogInfo->SysType =(enSysType)iSysModule;
LogInfo->ModType =(enModType)iModule;
LogInfo->LogType =(enLogType)iType;
LogInfo->Contnet = cContnet;
if (m_Log->enqueue(m_MsgBlock) == -1)
{
//压入队列失败,则释放该
m_MsgBlock->release();
delete m_MsgBlock;
m_MsgBlock = NULL;
}
}
else
{
//分配队列内存块失败
delete m_MsgBlock;
m_MsgBlock = NULL;
}
}
else
{
//分配结构体内存失败
delete LogInfo;
LogInfo = NULL;
}
m_LogMutex->release();
}
//写入文本文件
void CLOG::writeTxt(const stLogInfo* LogInfo)
{
}
//写入数据库
void CLOG::writeDB(const stLogInfo* LogInfo)
{
} |
|