peakzhang 发表于 2007-12-31 22:33:18

初学ACE的困惑

最近一段时间由于一个项目的需要,开始学习ace,并用于项目中。
在这个过程中,感觉ace提供的一些功能很不好用,不知道是自己用错了,还是ace就是这样,这里提出来,请大家指教。
比如使用ace的定时器,在schedule_timer后,需要在一个while循环中不停调用ACE_Reactor::handle_events才可以。在控制台程序中也就罢了,可是在gui的程序中,我不能让主线程就一直耗在这呀,结果我只好再另开一个线程才行。
另外ACE_SOCK_Dgram::recv函数和ACE_SOCK_Acceptor::accept函数也都类似。
按照我的想法,这些方法应该是异步的,我调用以后,立刻返回,等事件发生,通过类似Observer的形式来通知我。其实timer就是通过回调通知的,只不过却需要自己在外部不停地handle_events,如果这个步骤由ACE_Reactor自己内部来做就好了。
我才刚开始接触ace不久,如果是我使用方法有问题,请不吝赐教。

peakzhang 发表于 2007-12-31 22:33:24

你不要误解ACE的意图,ACE不会包办一切,它主要处理网络方面的编程,理解了ACE,绝大多数功能都很好用,而且很巧妙,简单。
Reactor的所有处理,都需要ACE_Reactor::instance()->run_reactor_event_loop();你上面的处理也可以用。GUI里面,肯定是需要启动一个线程的,不过并不麻烦呀,其实很简单。

//程序启动时候调用
ACE_Thread_Manager::instance()->spawn(thread_worker);
//工作循环
ACE_THR_FUNC_RETURN thread_worker(void *p)
{
ACE_Reactor::instance()->run_reactor_event_loop();
return 0;
}
//程序退出的时候,调用:
ACE_Reactor::instance()->end_reactor_event_loop();


数据收发的时候,你调用的对象方法,不是异步的,但ACE一样可以取得通知的。是你处理器的handle_xxx方法。外面不用调handle_events,用 ACE_Reactor::instance()->run_reactor_event_loop();里面其实也是这个。

peakzhang 发表于 2007-12-31 22:33:32

谢谢,我只是想知道是不是我用的方法不对头。

既然ACE是这样设计的,那我就这样用好了。

peakzhang 发表于 2007-12-31 22:33:57

我在主线程main中ACE_Proactor::instance()->run_proactor_event_loop();

在handle_read_stream() 中将mb 放到一个task的消息队列中,

在task自己的线程中不断从消息队列中取mb并处理,

那么我怎么才能结束主线程呢?

我又不想将ACE_Proactor的完成事件循环放到另外一个线程中,那样的话,主线程就不起作用了, 会降低效率的

主线程main函数

Accepte _Acceptor(&handler); //异步接收器, handler是一个ACE_Task主动对象
handler.activate();//


_Acceptor.open(ACE_INET_Addr(Port), 0,1,5,1 ,ACE_Proactor::instance(), 1, 1);

ACE_Proactor::instance()->proactor_run_event_loop();
页: [1]
查看完整版本: 初学ACE的困惑