找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3633|回复: 3

初学ACE的困惑

[复制链接]
发表于 2007-12-31 22:33:18 | 显示全部楼层 |阅读模式
最近一段时间由于一个项目的需要,开始学习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不久,如果是我使用方法有问题,请不吝赐教。
 楼主| 发表于 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();里面其实也是这个。
 楼主| 发表于 2007-12-31 22:33:32 | 显示全部楼层
谢谢,我只是想知道是不是我用的方法不对头。

既然ACE是这样设计的,那我就这样用好了。
 楼主| 发表于 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();
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 07:10 , Processed in 0.014112 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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