ACE_Async_Connector::connect 调用后有时无法完成,求助
连续执行以下代码生成的exe,会发现程序有时无法退出,不在为什么,环境:window7, vc2010, ACE6.0.0/ACE6.1.0,求大虾指教。
int ACE_TMAIN(int argc, ACE_TCHAR* argv[])
{
CAceConnector::DoWork();
}
class CSvcHandler:public ACE_Service_Handler
{
public:
virtual void open(ACE_HANDLE new_handle, ACE_Message_Block &message_block);
};
class CConnector: public ACE_Asynch_Connector<CSvcHandler>
{
protected:
int counter_; //计数机
int successCounter_;
public:
CConnector():counter_(0),successCounter_(0){}
virtual int validate_connection(const ACE_Asynch_Connect::Result& result, const ACE_INET_Addr &remote, const ACE_INET_Addr& local);
};
class CAceConnector:public ACE_Task_Base
{
public:
static void DoWork();
protected:
ACE_INET_Addr add_;
CConnector connector_;
public:
CAceConnector(void);
~CAceConnector(void);
bool Init();
virtual int svc();
};
#define EXECUTE_TIMES 3000
CAceConnector::CAceConnector(void)
{
}
CAceConnector::~CAceConnector(void)
{
}
void CSvcHandler::open(ACE_HANDLE new_handle, ACE_Message_Block &message_block)
{
MY_INFO("Hello");
}
int CConnector::validate_connection(const ACE_Asynch_Connect::Result& result, const ACE_INET_Addr &remote, const ACE_INET_Addr& local)
{
counter_++;
ACE_DEBUG((LM_INFO,"(%t)counter=%d status=%d \n",counter_,result.success()));
if(result.success())
{
this->successCounter_++;
//ACE_OS::shutdown(result.connect_handle(),ACE_SHUTDOWN_BOTH);
//ACE_OS::closesocket(result.connect_handle());
}
if(counter_>=EXECUTE_TIMES)
{
ACE_Proactor::instance()->proactor_end_event_loop();
ACE_DEBUG((LM_INFO,"execute complete: success %d \n",this->successCounter_));
}
return 0;
}
bool CAceConnector::Init()
{
ACE_TRACE(__FUNCTION__);
add_.set("192.168.1.66:4001");
if(this->activate()!=0)
{
ACE_ERROR((LM_ERROR,"%p","Thread start failed:"));
return false;
}
connector_.open();
for(int i=0;i<EXECUTE_TIMES;i++)
{
if(connector_.connect(add_)==-1)
{
ACE_ERROR((LM_ERROR,"%p","connect server failed:"));
ACE_Proactor::instance()->proactor_end_event_loop();
return false;
}
}
return true;
}
int CAceConnector::svc()
{
MY_INFO("(%t)....");
ACE_Proactor::instance()->proactor_run_event_loop();
return 0;
}
void CAceConnector::DoWork()
{
MY_INFO("(%t) main thread start...");
CAceConnector *lpconnectThread=new CAceConnector();
if(lpconnectThread->Init())
{
MY_INFO("(%t) init success.");
}
lpconnectThread->wait();
MY_INFO("(%t) main thread exit...");
delete lpconnectThread;
}