找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: tiburon

VC下创建ACE_Select_Reactor出错

[复制链接]
 楼主| 发表于 2008-11-12 09:03:13 | 显示全部楼层
好像找到了,按照你的思路,我上网查了查,有人提议打开编译器的/GR选项:启用运行时类型信息。最起码创建这句不会报错了,运行时还没有详细测过。我想请问一句,这个选项与ACE有什么关系?

谢谢!
 楼主| 发表于 2008-11-12 12:23:43 | 显示全部楼层
连接数好像是解决了,运行也无大问题(没有更加详细的测试)。但程序退出时又报了个错,错误在select_reactor_t.cpp:

  // If there are any bits enabled in the <ready_set_> then we'll
  // handle those first, otherwise we'll block in <select>.
  if (number_of_active_handles == 0)
    {
      do
        {
          this_timeout =
            this->timer_queue_->calculate_timeout (max_wait_time,
                                                   &timer_buf);这一句出错
          width = (u_long) this->handler_rep_.max_handlep1 ();
          dispatch_set.rd_mask_ = this->wait_set_.rd_mask_;
          dispatch_set.wr_mask_ = this->wait_set_.wr_mask_;
          dispatch_set.ex_mask_ = this->wait_set_.ex_mask_;
          number_of_active_handles = ACE_OS::select (int (width),
                                                     dispatch_set.rd_mask_,
                                                     dispatch_set.wr_mask_,
                                                     dispatch_set.ex_mask_,
                                                     this_timeout);
        }
      while (number_of_active_handles == -1 && this->handle_error () > 0);


不明白啥意思?
发表于 2008-11-12 15:58:48 | 显示全部楼层
运行时候出错,那就是另外一回事了。
应该是你用法错误,比如线程同步不对等。
需要看你怎么做的同步
 楼主| 发表于 2008-11-12 18:43:52 | 显示全部楼层

回复 #23 winston 的帖子

我是这么做的:
这个程序会监听4个TCP端口,接受各个端口的连接和数据
但我只有一个线程跑ACE_Reactor::instance()->run_reactor_event_loop();

我也没做什么同步控制。
 楼主| 发表于 2008-11-12 18:56:49 | 显示全部楼层

回复 #23 winston 的帖子

我之前的代码是这样的:

ACE_Reactor::instance()->owner(ACE_OS::thr_self());
ACE_Reactor::instance()->run_reactor_event_loop();

如果去掉前面一句,退出时就不会报错。想问问,这句为什么会引发错误?
 楼主| 发表于 2008-11-12 19:09:55 | 显示全部楼层

回复 #23 winston 的帖子

这是线程的入口函数

UINT WINAPI CoreApp::ClientAcceptorHandle(LPVOID s)
{
        CoreApp * app = (CoreApp *)s;
        ACE_Reactor::instance()->run_reactor_event_loop();
        SetEvent(app->m_handles[0]);

        return 1;
}

我在其他地方这么创建的

        UINT                                                                threadid;
        if ( -1L == _beginthreadex(NULL, 0, ClientAcceptorHandle, app, 0, &threadid) )
                FEZCoreUtil::WriteLog("Create ClientAcceptorHandle thread fail\r\n");
        else
                FEZCoreUtil::WriteLog("Create ClientAcceptorHandle thread suc\r\n");


我想问这么用正确吗?


有点奇怪,我单步调试时发现线程函数,直接跳过ACE_Reactor::instance()->run_reactor_event_loop();没停在这句,然后就退出这个函数了。我不明白。我用了版本5.6的ACE,之前是5.5。解决了,还是得用这句:ACE_Reactor::instance()->owner(ACE_OS::thr_self());。但我不明白为什么要写这么一句?

[ 本帖最后由 tiburon 于 2008-11-12 19:47 编辑 ]
发表于 2008-11-12 20:55:32 | 显示全部楼层
ACE_Reactor::instance()->owner(ACE_OS::thr_self());

Only one thread (called the owner) can invoke ACE_Select_Reactor::handle_events() at a time. By default, the owner of an ACE_Reactor is the identity of the thread that initialized it. The ACE_Select_Reactor::owner() method is used to change ownership of the ACE_Select_Reactor to a particular thread id. This method is useful when the thread running the reactor's event loop differs from the thread that initialized the reactor. The event_loop() function on page 97 illustrates this use case.

貌似兄弟你还没看书。
C++网络编程卷1、卷2,程序员指南,否则不应该问这个问题。
另外,上一页你的程序问题很多呀。
不看书基本上是写不了ACE应用程序的。
 楼主| 发表于 2008-11-13 08:04:30 | 显示全部楼层

回复 #27 winston 的帖子

昨晚温习了一遍,看到了类似的说明,明白了那句的意思。非常感谢你的帮忙。我正在重新温习程序员指南。


不过,看到你说的那句“上一页你的程序问题很多呀”,心里毛毛的。如果你有空的话,还望不吝赐教!

希望得到您的指点!

[ 本帖最后由 tiburon 于 2008-11-14 08:31 编辑 ]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 22:00 , Processed in 0.024357 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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