tiburon 发表于 2008-11-8 19:44:37

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

winston 发表于 2008-11-8 22:15:34

贴上完整的代码。

tiburon 发表于 2008-11-10 08:18:48

因为,我在咱们这个论坛上看到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 编辑 ]

winston 发表于 2008-11-10 13:06:26

我写测试程序测试了一下,居然也出现了这个错误,和你的一样。而且编译还出了其它的错。
经过研究和探究,解决了。
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后,解决了发现的问题。

希望以上说明能解决你的问题。

tiburon 发表于 2008-11-10 14:09:45

ACE的包含类,要放在MFC程序中的stdafx.h里面,尽量不要放到其它地方。
这句话我该如何理解?关键是我不太明白"ACE的包含类,要放在MFC程序中的stdafx.h里面"。

和Windows头文件相关的编译宏也改一下
具体我该怎么做?


我想再问问,您说的这些编译宏,是在编译ACE时指定的吗?还是在编译使用ACE程序里?

而且,我的程序没有使用MFC,所以就没有stdafx.h头文件。我该怎么做?

也许问题有点傻,希望能获得您的答复。

[ 本帖最后由 tiburon 于 2008-11-10 14:13 编辑 ]

winston 发表于 2008-11-10 17:52:11

哦。我以为是MFC混合ACE。
那样也类似。
就是说,ACE的相关文件,要放到比较靠前的地方。stdafx.h是个,如果没有,那么公共的包含头文件也是一个地方。
就是那些声明ACE类的文件。
那些宏定义,编译在使用ACE程序里。我上面帖的,是我的测试程序里面的内容,是编译windows程序可以使用的。

tiburon 发表于 2008-11-11 09:20:20

回复 #6 winston 的帖子

只是重新编译ACE就可以了。需不需要修改什么参数?

tiburon 发表于 2008-11-11 10:00:07

回复 #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,未改动任何参数。再次重新编译我的程序,运行后仍然抱错。

winston 发表于 2008-11-11 14:30:22

编译程序需要的lib和运行时需要的DLL,需要同步更新,自己检查一下吧。
不要用老的LIB或者DLL,否则就没道理还出现错误了。

tiburon 发表于 2008-11-11 15:31:54

回复 #9 winston 的帖子

我已经拷了新的dll和lib,还是抱错。

我觉得我还是遗漏些什么没改。你说的要重新编译ACE。但我没注意到关于重编译ACE有什么需要修改的环境参数或其他操作。
能否再帮我指明一下。

谢谢!
页: [1] 2 3
查看完整版本: VC下创建ACE_Select_Reactor出错