找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 8579|回复: 5

proactor下定时器的问题

[复制链接]
发表于 2011-4-20 17:23:25 | 显示全部楼层 |阅读模式
本帖最后由 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,定时器有时运行,有时不运行,什么原因?
发表于 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一下这个方法,就可以了
 楼主| 发表于 2011-4-20 17:40:58 | 显示全部楼层
版主真快,经过测试,使用ACE_Asynch_Connector,定时器有时运行,有时不运行,什么原因?
 楼主| 发表于 2011-4-20 17:52:07 | 显示全部楼层
真郁闷,刚才怎么测试,handle_time_out都不运行,重新REBUILD工程一下,怎么测试都运行了,不知道什么原因啊?
发表于 2011-4-20 17:52:34 | 显示全部楼层
具体要看代码,肯定不会有时运行有时不运行的,一定有某些原因制约。这个不看具体东西没法说。
 楼主| 发表于 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;
}
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 16:22 , Processed in 0.014228 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表