找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4535|回复: 1

ACE库自带的例子的问题

[复制链接]
发表于 2011-11-19 13:15:59 | 显示全部楼层 |阅读模式
本帖最后由 chennut0802 于 2011-11-19 13:17 编辑

大家好,我运行ACE库自带的例子,具体代码如下:
  1. #include "ace/Reactor.h"
  2. #include "ace/Service_Config.h"
  3. #include "ace/OS_main.h"
  4. class Timeout_Handler : public ACE_Event_Handler
  5. {
  6. public:
  7.   Timeout_Handler (void)
  8.     : count_ (0) {}
  9.   virtual int handle_timeout (const ACE_Time_Value &tv,
  10.                               const void *arg)
  11.     {
  12.       ACE_DEBUG ((LM_DEBUG,
  13.                   "%d timeout occurred for %s./n",
  14.                   ++count_,
  15.                   (char *) arg));
  16.       return 0;
  17.     }
  18. private:
  19.   int count_;
  20. };
  21. int
  22. ACE_TMAIN (int, ACE_TCHAR *[])
  23. {
  24.   Timeout_Handler handler;
  25.   // 每隔1秒执行一次,延迟1秒才开始计时
  26.   ACE_Time_Value bar_tv (1);
  27.   ACE_Reactor::instance ()->schedule_timer (&handler,
  28.                                             (void *) "Bar",
  29.                                             bar_tv,
  30.                                             bar_tv);
  31.   // 每隔1秒执行一次,延迟1秒才开始计时
  32.   ACE_Time_Value foo_tv (1);
  33.   ACE_Reactor::instance ()->schedule_timer (&handler,
  34.                                             (void *) "Foo",
  35.                                             foo_tv,
  36.                                             foo_tv);
  37.   // 设置事件处理超时为12秒
  38.   ACE_Time_Value run_time (12);
  39.   if (ACE_Reactor::run_event_loop(run_time) == -1)
  40.     ACE_ERROR_RETURN ((LM_ERROR, "%p./n", "main"), -1);
  41.   return 0;
  42. }
复制代码
运行的结果:
1 timeout occurred for Bar.
2 timeout occurred for Foo.
3 timeout occurred for Bar.
4 timeout occurred for Foo.
5 timeout occurred for Bar.
6 timeout occurred for Foo.
7 timeout occurred for Bar.
8 timeout occurred for Foo.
9 timeout occurred for Bar.
10 timeout occurred for Foo.
11 timeout occurred for Bar.
12 timeout occurred for Foo.
13 timeout occurred for Bar.
14 timeout occurred for Foo.
15 timeout occurred for Bar.
16 timeout occurred for Foo.
17 timeout occurred for Bar.
18 timeout occurred for Foo.
19 timeout occurred for Bar.
20 timeout occurred for Foo.
21 timeout occurred for Bar.
22 timeout occurred for Foo.
23 timeout occurred for Bar.
24 timeout occurred for Foo.

之后出现错误“TestACE.exe 中的 0xabababab 处未处理的异常: 0xC0000005: 读取位置 0xabababab 时发生访问冲突”。
请问4个问题:
1.以上的错误是有什么引起的?
2.在使用ace库的时候,入口函数main与ACE_TMAIN有什么不同呢?
3.为什么没有调用ACE::init();与ACE::fini();程序还能运行呢?
4.开源软件如ace,为什么不直接把lib和头文件发布出来,需要用户自己编译呢?

请大家分别回答以上问题,谢谢!
发表于 2011-11-20 10:57:59 | 显示全部楼层
1、run_event_loop循环结束,但你注册的定时器没有主动取消,还在运行,出错了。
2、ACE_TMAIN是一个宏定义,可以查,里面就是ACE的初始化动作。
3、ACE_TMAIN里面调用了ACE::init()
4、因为ACE软件功能强大,适应性非常广泛。不同场合往往有不同的应用需求,需要设置不同的选项进行调整,这样提前预编译好类库,带来的问题恐怕会远远大于让用户自己根据需要编译。
绝大多数开源软件都是要自己编译、设置的,几乎成为习惯。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-6-16 09:15 , Processed in 0.022106 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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