找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3939|回复: 1

在DLL中,调用一个ACE_Task线程,但报异常错误!

[复制链接]
发表于 2009-2-6 23:12:16 | 显示全部楼层 |阅读模式
在外部调用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)
{

}
 楼主| 发表于 2009-2-8 22:11:00 | 显示全部楼层

回复 #1 wsqwang884 的帖子

该问题已经解决掉了。
在使用ACE的ACE_Task编写DLL时,且在Win32下运行,必须对ACE进行初始化:
#include <ace/ACE.h>
ACE::init();//初始化 DLL进入时使用
ACE::fini();//释放初始化 退出时使用
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 22:14 , Processed in 0.018447 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表