| 
 | 
 
 楼主 |
发表于 2009-5-31 00:26:04
|
显示全部楼层
 
 
 
我的代码实现大致上是这样的: 
 
int Connect::InitConnect() //这是我初始化线程的方法  
{ 
        ACE_Select_Reactor  pSelectReactor; 
        ACE_NEW_RETURN (pSelectReactor, ACE_Select_Reactor, -1); 
        ACE_Reactor pReactor; 
        ACE_NEW_RETURN (pReactor, ACE_Reactor(ACE_Select_Reactor, 1), -1); 
        ACE_Reactor::instance(pReactor, 1); 
 
        if (StartThead(pReactor)) //这里是调动一个线程来实现连接设备的, 
                                                          //这里面是使用CClient的指针来实现连接的。 
        { 
                return -1; 
        } 
        return 0; 
} 
 
int CClient::open(void *p) 
{ 
        if (acceptor_.open (local_addr) == -1) return -1; 
        return reactor ()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK); 
} 
 
int CClient::handle_input(ACE_HANDLE) 
{ 
        if (收到数据) 
        { 
                Split(strData); //该方法是用来将收到的消息进行分割并通知上层的。 
        } 
 
        return 0; 
} 
 
int CClient::handle_timeout(ACE_HANDLE) 
{ 
        //设定时器,如果到达定时器时间handle_input还没有收到相应的数据则超时 
        this->peer()->handle_close(); //这里是可以调用的, 
                                                                  //理论上调用完这个方法应该调用CClient::handle_close() 
        return 0; 
} 
 
int CClient::handle_close (ACE_HANDLE, ACE_Reactor_Mask) 
{  
        SVC_Handle::handle_close();//这里好像是要调用父类的handle_close(),进行释放。 
         
        return 0;  
} 
 
基本上我使用的ACE_Select_Reactor就是这样的。原来是直接使用ACE_Reactor的没有出现过数据接收超时的情况,在windows平台下ACE_Reactor的默认实现类是ACE_WMFO_Reactor,我将其替换为ACE_Select_Reactor,来避免受最大62事件处理的限制,就出现的接收数据超时的情况。 |   
 
 
 
 |