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,定时器有时运行,有时不运行,什么原因? 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一下这个方法,就可以了 版主真快,经过测试,使用ACE_Asynch_Connector,定时器有时运行,有时不运行,什么原因? 真郁闷,刚才怎么测试,handle_time_out都不运行,重新REBUILD工程一下,怎么测试都运行了,不知道什么原因啊? 具体要看代码,肯定不会有时运行有时不运行的,一定有某些原因制约。这个不看具体东西没法说。 本帖最后由 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]