liforget_bain 发表于 2011-4-20 17:23:25

proactor下定时器的问题

本帖最后由 liforget_bain 于 2011-4-20 17:40 编辑

我将定时器和proactor关联,定时器virtual void handle_time_out (const ACE_Time_Value &tv,const void *act = 0);在接收器的处理器中,使用ACE_Asynch_Acceptor下定时器正常,可是使用ACE_Asynch_Connector定时器却无法运行?handle_time_out 无法运行,为什么啊?

经过测试,使用ACE_Asynch_Connector,定时器有时运行,有时不运行,什么原因?

freeeyes 发表于 2011-4-20 17:39:53

ACE_Asynch_Connector,你要看你的反应器是否已经进入了run_loop。
定时器不运行,先看看它关联的反应器是否工作正常。
如果不是很必要,推荐用ace自己的定时器。
typedef ACE_Thread_Timer_Queue_Adapter<ACE_Timer_Heap> ActiveTimer;
typedef ACE_Singleton<ActiveTimer, ACE_Null_Mutex> App_TimerManager;
具体google一下这个方法,就可以了

liforget_bain 发表于 2011-4-20 17:40:58

版主真快,经过测试,使用ACE_Asynch_Connector,定时器有时运行,有时不运行,什么原因?

liforget_bain 发表于 2011-4-20 17:52:07

真郁闷,刚才怎么测试,handle_time_out都不运行,重新REBUILD工程一下,怎么测试都运行了,不知道什么原因啊?

freeeyes 发表于 2011-4-20 17:52:34

具体要看代码,肯定不会有时运行有时不运行的,一定有某些原因制约。这个不看具体东西没法说。

liforget_bain 发表于 2011-4-20 17:59:24

本帖最后由 liforget_bain 于 2011-4-20 18:01 编辑

代码很简单:
AIO_CLD_Connect 类
class AIO_CLD_Connect : public ACE_Asynch_Connector<HA_Proactive_Service>
{
public:
      AIO_CLD_Connect();
      ~AIO_CLD_Connect();
      virtual int validate_connection(const ACE_Asynch_Connect::Result& result, const ACE_INET_Addr &remote, const ACE_INET_Addr& local);

      bool is_connect;

      int local_port;

protected:
      virtual HA_Proactive_Service *make_handler(void);

};

HA_Proactive_Service处理器类:
void HA_Proactive_Service::handle_time_out (const ACE_Time_Value &tv,const void *act)
{
      printf("!");
}


void HA_Proactive_Service::open (ACE_HANDLE new_handle, ACE_Message_Block&)
{
                ACE_Time_Value time_inter(1);
                ACE_Proactor::instance()->schedule_timer(*this,0,time_inter,time_inter);

                LogicThread::instance()->open();

                //delete this;
                //return ;
                LogicThread::instance()->handler=this;
                canwrite=true;
               


                ACE_SOCK_Stream temp_peer(new_handle);
                int bufsiz=4096;
                temp_peer.set_option(SOL_SOCKET,SO_SNDBUF,&bufsiz,sizeof(bufsiz));

                this->handle (new_handle);

                if (this->writer_.open (*this) != 0 || this->reader_.open(*this) != 0)
                {
                              ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"),ACE_TEXT ("HA_Proactive_Service open")));
                              delete this;
                              return;
                }

                ACE_OS::printf("connceted\n");

                ACE_NEW_NORETURN(mblk_,ACE_Message_Block(LOG_HEADER_SIZE));
                reader_.read(*mblk_,LOG_HEADER_SIZE);
}

WorkThread类:
int WorkThread::star(int nMax)
{
                create_proactor();
                this->activate (THR_NEW_LWP, nMax);
                for (;nMax>0;nMax--)
                {
                        sem_.acquire();
                }
                return 0;
}
int WorkThread::stop()
{
                ACE_Proactor::end_event_loop();
                this->wait();
                return 0;
}
int WorkThread::release_proactor()
{
                ACE_Proactor::close_singleton ();
                proactor_ = 0;
                return 0;
}
int WorkThread::create_proactor()
{

                this->proactor_ = ACE_Proactor::instance();

                return 0;
}

int WorkThread::svc()
{
                ACE_DEBUG((LM_INFO,ACE_TEXT("I/O线程运行!\n")));
                sem_.release(1);
                ACE_Proactor::run_event_loop();
                printf("完成端口释放");
                return 0;
}

int main(int argc, char* argv[])
{
      WorkThread task;
      task.star(2);

      Sleep(1000);

      AIO_CLD_Connect connector;

      ACE_INET_Addr addr(9999,"192.168.0.116");

      connector.open();
      if (connector.connect(addr) == -1){
                printf("连接出错");
                return 0;
      }      
      ACE_Thread_Manager::instance()->wait();
      printf("退出");
      return 0;
}
页: [1]
查看完整版本: proactor下定时器的问题