VC下创建ACE_Select_Reactor出错
ACE_Select_Reactor * selectReactor = new ACE_Select_Reactor();ACE_Reactor * coreReactor = new ACE_Reactor(selectReactor, 1);
ACE_Reactor::instance(&coreReactor, 1);
代码如上,程序初始化时想创建一个ACE_Select_Reactor,但单步时显示在new ACE_Select_Reactor时就出错,具体位置为:
_CRTIMP void * __cdecl malloc (
size_t nSize
)
{
void *res = _nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0);//这一句出错,不知道为什么?
RTCCALLBACK(_RTC_Allocate_hook, (res, nSize, 0));
return res;
}
有哪位大虾能帮忙解决吗?
XP SP3 ,VC 2003 贴上完整的代码。 因为,我在咱们这个论坛上看到windows下缺省用的是ACE_WFMO_Reactor,最大只支持62个客户端,所以我就想换个别的reactor试试。
BOOL CoreApp::OnStart()
{
ACE::init();
m_util = new FEZCoreUtil;
m_util->ReadConfig();
SysParamData.distributePolicy = 1;
FEZCoreUtil::WriteLog("Read configure information start\r\n");
m_util->GetBoxs();
m_util->GetUsers();
/* 创建接收传真验证列表及顺序 */
m_util->GetRVPolicyList();
/* 创建按键验证列表及顺序 */
m_util->GetRVPressKeyList();
FEZCoreUtil::WriteLog("Read configure information end\r\n");
SysSykesBoxs = new CoreUserBox("", "");
FEZCoreUtil::WriteLog("Starting\r\n");
ACE_Select_Reactor * selectReactor = new ACE_Select_Reactor();
ACE_Reactor * coreReactor = new ACE_Reactor(selectReactor, 1);
ACE_Reactor::instance(coreReactor, 1);
ACE_INET_Addr port_to_listen(1999);
ACE_INET_Addr schedulerport_to_listen(SysParamData.schedulerPort);
ACE_INET_Addr converterport_to_listen(SysParamData.converterPort);
ACE_INET_Addr realinfoport_to_listen(2009);
ACE_INET_Addr realinfoport_to_connect(3456, ACE_LOCALHOST);
if ( g_clientAcceptor.open(port_to_listen) == -1 )
{
FEZCoreUtil::WriteLog("Listening port 1999 fail\r\n");
g_warn.sendWarning("Listening port 1999 fail");
return FALSE;
}
FEZCoreUtil::WriteLog("Listening port 1999 suc\r\n");
if ( g_schedulerAcceptor.open(schedulerport_to_listen) == -1 )
{
FEZCoreUtil::WriteLog("Listening port 2000 fail\r\n");
g_warn.sendWarning("Listening port 2000 fail");
return FALSE;
}
FEZCoreUtil::WriteLog("Listening port 2000 suc\r\n");
if ( g_converterAcceptor.open(converterport_to_listen) == -1 )
{
FEZCoreUtil::WriteLog("Listening port 2001 fail\r\n");
g_warn.sendWarning("Listening port 2001 fail");
return FALSE;
}
FEZCoreUtil::WriteLog("Listening port 2001 suc\r\n");
if ( g_realinfoAcceptor.open(realinfoport_to_listen) == -1 )
{
FEZCoreUtil::WriteLog("Listening port 2009 fail\r\n");
g_warn.sendWarning("Listening port 2009 fail");
return FALSE;
}
FEZCoreUtil::WriteLog("Listening port 2009 suc\r\n");
UINT threadid;
if ( -1L == _beginthreadex(NULL, 0, ClientAcceptorHandle, app, 0, &threadid) )
FEZCoreUtil::WriteLog("Create ClientAcceptorHandle thread fail\r\n");
else
FEZCoreUtil::WriteLog("Create ClientAcceptorHandle thread suc\r\n");
m_dbHandle = new DBHandle("FezCoreDBhandleEvent", 100);
if ( m_dbHandle )
FEZCoreUtil::WriteLog("Create DBHandle thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create DBHandle thread fail\r\n");
m_distributeManage = new DistributeManage("FezCoreDistributeManageEvent", 100);
if ( m_distributeManage )
FEZCoreUtil::WriteLog("Create DistributeManage thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create DistributeManage thread fail\r\n");
m_revValidateManage = new ReceiveValidateManage("FezCoreReceiveValidateEvent", 100);
if ( m_revValidateManage )
FEZCoreUtil::WriteLog("Create ReceiveValidateManage thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create ReceiveValidateManage thread fail\r\n");
m_revValidating = new ReceiveValidating("FezCoreReceiveValidatingEvent", 100);
if ( m_revValidating )
FEZCoreUtil::WriteLog("Create ReceiveValidating thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create ReceiveValidating thread fail\r\n");
m_loginManage = new LoginManage("FezCoreLoginManageEvent", 100);
if ( m_loginManage )
FEZCoreUtil::WriteLog("Create LoginManage thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create LoginManage thread fail\r\n");
m_clientCommuThread = new ClientCommunicate("FezCoreClientCommunicateEvent", 100);
if ( m_clientCommuThread )
FEZCoreUtil::WriteLog("Create ClientCommunicate thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create ClientCommunicate thread fail\r\n");
m_scheduCommuThread = new SchedulerCommunicate("FezCoreSchedulerCommunicateEvent", 100);
if ( m_scheduCommuThread )
FEZCoreUtil::WriteLog("Create SchedulerCommunicate thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create SchedulerCommunicate thread fail\r\n");
m_converterCommuThread = new ConverterCommunicate("FezCoreConverterCommunicateEvent", 100);
if ( m_converterCommuThread )
FEZCoreUtil::WriteLog("Create ConverterCommunicate thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create ConverterCommunicate thread fail\r\n");
m_mailCommuThread = new MailCommunicate("FezCoreMailCommunicateEvent",100);
if ( m_mailCommuThread )
FEZCoreUtil::WriteLog("Create MailCommunicate thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create MailCommunicate thread fail\r\n");
m_sendManageThread = new SendFaxManage("FezCoreSendMangeEvent", 100);
if ( m_sendManageThread )
FEZCoreUtil::WriteLog("Create SendFaxManage thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create SendFaxManage thread fail\r\n");
m_validateThread = new SendFaxValidating("FezCoreSendFaxTaskValidatingEvent", 100);
if ( m_validateThread )
FEZCoreUtil::WriteLog("Create SendFaxValidating thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create SendFaxValidating thread fail\r\n");
m_netSendThread = new NetSend("FezCoreNetSendEvent", 100);
if ( m_netSendThread )
FEZCoreUtil::WriteLog("Create NetSend thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create NetSend thread fail\r\n");
m_realInfo = new RealInfo("FezCoreRealInfoEvent", 100);
if ( m_realInfo )
FEZCoreUtil::WriteLog("Create RealInfo thread suc\r\n");
else
FEZCoreUtil::WriteLog("Create RealInfo thread fail\r\n");
return TRUE;
}
UINT WINAPI CoreApp::ClientAcceptorHandle(LPVOID s)
{
ACE_Reactor::instance()->run_reactor_event_loop();
return 1;
}
[ 本帖最后由 tiburon 于 2008-11-10 08:21 编辑 ] 我写测试程序测试了一下,居然也出现了这个错误,和你的一样。而且编译还出了其它的错。
经过研究和探究,解决了。
1、ACE的包含类,要放在MFC程序中的stdafx.h里面,尽量不要放到其它地方。有时候的确有冲突。
和Windows头文件相关的编译宏也改一下:
#ifndef WINVER // 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。
#define WINVER 0x0500 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif
#ifndef _WIN32_WINNT // 允许使用 Windows NT 4 或更高版本的特定功能。
#define _WIN32_WINNT 0x0500 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif
#ifndef _WIN32_WINDOWS // 允许使用 Windows 98 或更高版本的特定功能。
#define _WIN32_WINDOWS 0x0510 //为 Windows Me 及更新版本改变为适当的值。
#endif
#ifndef _WIN32_IE // 允许使用 IE 4.0 或更高版本的特定功能。
#define _WIN32_IE 0x0600 //为 IE 5.0 及更新版本改变为适当的值。
#endif
2、要重新编译ACE的LIB,我重新编译ACE的LIB后,解决了发现的问题。
希望以上说明能解决你的问题。 ACE的包含类,要放在MFC程序中的stdafx.h里面,尽量不要放到其它地方。
这句话我该如何理解?关键是我不太明白"ACE的包含类,要放在MFC程序中的stdafx.h里面"。
和Windows头文件相关的编译宏也改一下
具体我该怎么做?
我想再问问,您说的这些编译宏,是在编译ACE时指定的吗?还是在编译使用ACE程序里?
而且,我的程序没有使用MFC,所以就没有stdafx.h头文件。我该怎么做?
也许问题有点傻,希望能获得您的答复。
[ 本帖最后由 tiburon 于 2008-11-10 14:13 编辑 ] 哦。我以为是MFC混合ACE。
那样也类似。
就是说,ACE的相关文件,要放到比较靠前的地方。stdafx.h是个,如果没有,那么公共的包含头文件也是一个地方。
就是那些声明ACE类的文件。
那些宏定义,编译在使用ACE程序里。我上面帖的,是我的测试程序里面的内容,是编译windows程序可以使用的。
回复 #6 winston 的帖子
只是重新编译ACE就可以了。需不需要修改什么参数?回复 #6 winston 的帖子
以下是我的一个公共头文件的最靠前的一部分代码#ifndef CORE_UTIL_20060801__HPP
#define CORE_UTIL_20060801__HPP
#pragma once
#ifndef WINVER // 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。
#define WINVER 0x0500 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif
#ifndef _WIN32_WINNT // 允许使用 Windows NT 4 或更高版本的特定功能。
#define _WIN32_WINNT 0x0500 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif
#ifndef _WIN32_WINDOWS // 允许使用 Windows 98 或更高版本的特定功能。
#define _WIN32_WINDOWS 0x0510 //为 Windows Me 及更新版本改变为适当的值。
#endif
#ifndef _WIN32_IE // 允许使用 IE 4.0 或更高版本的特定功能。
#define _WIN32_IE 0x0600 //为 IE 5.0 及更新版本改变为适当的值。
#endif
#include "ace/streams.h"
#include "ace/Log_Msg.h"
#include "ace/Log_Msg_Callback.h"
#include "ace/Log_Record.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Connector.h"
#include "ace/INET_Addr.h"
#include "ace/Singleton.h"
#include "ace/Message_Block.h"
#include "ace/Svc_Handler.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/Reactor.h"
#include "ace/Acceptor.h"
#include "ace/Connector.h"
#include "ace/Reactor_Notification_Strategy.h"
#include "ace/Select_Reactor.h"
而且我也重新编译了ACE,未改动任何参数。再次重新编译我的程序,运行后仍然抱错。 编译程序需要的lib和运行时需要的DLL,需要同步更新,自己检查一下吧。
不要用老的LIB或者DLL,否则就没道理还出现错误了。
回复 #9 winston 的帖子
我已经拷了新的dll和lib,还是抱错。我觉得我还是遗漏些什么没改。你说的要重新编译ACE。但我没注意到关于重编译ACE有什么需要修改的环境参数或其他操作。
能否再帮我指明一下。
谢谢!