tiburon 发表于 2008-11-12 09:03:13

好像找到了,按照你的思路,我上网查了查,有人提议打开编译器的/GR选项:启用运行时类型信息。最起码创建这句不会报错了,运行时还没有详细测过。我想请问一句,这个选项与ACE有什么关系?

谢谢!

tiburon 发表于 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);


不明白啥意思?

winston 发表于 2008-11-12 15:58:48

运行时候出错,那就是另外一回事了。
应该是你用法错误,比如线程同步不对等。
需要看你怎么做的同步

tiburon 发表于 2008-11-12 18:43:52

回复 #23 winston 的帖子

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

我也没做什么同步控制。

tiburon 发表于 2008-11-12 18:56:49

回复 #23 winston 的帖子

我之前的代码是这样的:

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

如果去掉前面一句,退出时就不会报错。想问问,这句为什么会引发错误?

tiburon 发表于 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);

      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 编辑 ]

winston 发表于 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应用程序的。

tiburon 发表于 2008-11-13 08:04:30

回复 #27 winston 的帖子

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


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

希望得到您的指点!

[ 本帖最后由 tiburon 于 2008-11-14 08:31 编辑 ]
页: 1 2 [3]
查看完整版本: VC下创建ACE_Select_Reactor出错