谢谢! 连接数好像是解决了,运行也无大问题(没有更加详细的测试)。但程序退出时又报了个错,错误在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);
不明白啥意思? 运行时候出错,那就是另外一回事了。
应该是你用法错误,比如线程同步不对等。
需要看你怎么做的同步
回复 #23 winston 的帖子
我是这么做的:这个程序会监听4个TCP端口,接受各个端口的连接和数据
但我只有一个线程跑ACE_Reactor::instance()->run_reactor_event_loop();
我也没做什么同步控制。
回复 #23 winston 的帖子
我之前的代码是这样的:ACE_Reactor::instance()->owner(ACE_OS::thr_self());
ACE_Reactor::instance()->run_reactor_event_loop();
如果去掉前面一句,退出时就不会报错。想问问,这句为什么会引发错误?
回复 #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 编辑 ] 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应用程序的。
回复 #27 winston 的帖子
昨晚温习了一遍,看到了类似的说明,明白了那句的意思。非常感谢你的帮忙。我正在重新温习程序员指南。不过,看到你说的那句“上一页你的程序问题很多呀”,心里毛毛的。如果你有空的话,还望不吝赐教!
希望得到您的指点!
[ 本帖最后由 tiburon 于 2008-11-14 08:31 编辑 ]