psycheqiqi 发表于 2009-9-22 09:44:54

回复 #10 modern 的帖子

ACE_Dev_Poll_Reactor无法在windows上运行,但改成能在windows上运行的代码,就2、3行而已,顶多加载一个宏定义
我在论坛里看的帖子这么说的

如果不支持的话那么只能改成proactor?

psycheqiqi 发表于 2009-9-22 10:13:26

回复 #10 modern 的帖子

UINT ThreadReactor(LPVOID param)
{
    ACE_INET_Addr port_listen(10000);
        ClientAcceptor clientAcceptor;

    ACE_Select_Reactor select_reactor;
ACE_Reactor reactor(&select_reactor);
    clientAcceptor.reactor(ACE_Reactor::instance(&reactor));

    if(clientAcceptor.open(port_listen) == -1)
      return -1;

    CAceTestDlg *dlg=(CAceTestDlg*)AfxGetApp()->GetMainWnd();
    dlg->MessageBox("服务器已启动");
       
    int result = ACE_Reactor::instance()->run_reactor_event_loop();
    return result;
}


void CAceTestDlg::OnButServer()
{
        // TODO: Add your control notification handler code here
        UpdateData(TRUE);//
        AfxBeginThread(ThreadReactor,NULL);
        UpdateData(FALSE);
}
在线程中初始化 ACE_Select_Reactor select_reactor;时程序运行出错,为什么?

modern 发表于 2009-9-22 10:17:34

恩,问问题之前看前人的帖子是个好习惯,
不过我认为磨刀不费砍材功,
楼主最好先看看书,不用多,就看C++NPV2第四章就成。
楼主遇到的问题,书上都已经给出明确的解释了。
让我们说也是复制一遍书上的内容。

psycheqiqi 发表于 2009-9-22 11:16:45

原帖由 psycheqiqi 于 2009-9-22 10:13 发表 http://www.acejoy.com/bbs/images/common/back.gif
UINT ThreadReactor(LPVOID param)
{
    ACE_INET_Addr port_listen(10000);
      ClientAcceptor clientAcceptor;

    ACE_Select_Reactor select_reactor;
ACE_Reactor reactor(&select_reactor);
    clientAccep ...

为什么会出错呢,看了书也没找到答案

psycheqiqi 发表于 2009-9-22 11:37:34

回复 #14 psycheqiqi 的帖子

找到了。设置Enable Run-Time Type Infomation(RTTI)

psycheqiqi 发表于 2009-9-22 13:54:53

回复 #13 modern 的帖子

UINT ThreadReactor(LPVOID param)
{
    ACE_INET_Addr port_listen(10000);
        ClientAcceptor clientAcceptor;

    ACE_Select_Reactorselect_reactor;
    ACE_Reactor reactor(&select_reactor);
        ACE_Reactor::instance(&reactor);

    clientAcceptor.reactor(ACE_Reactor::instance(&reactor));
    if(clientAcceptor.open(port_listen) == -1)
      return -1;

        CAceTestDlg *dlg=(CAceTestDlg*)AfxGetApp()->GetMainWnd();
    dlg->MessageBox("服务器已启动");
       
   reactor.owner(ACE_OS::thr_self());   
    int result = ACE_Reactor::instance()->run_reactor_event_loop();

    return result;
}


void CAceTestDlg::OnButServer()
{
        // TODO: Add your control notification handler code here
        UpdateData(TRUE);
        AfxBeginThread(ThreadReactor,NULL);
        UpdateData(FALSE);
               

}

void CAceTestDlg::OnButtonClose()
{
        // TODO: Add your control notification handler code here

        ACE_Reactor::instance()->end_reactor_event_loop();
        CAceTestDlg *dlg=(CAceTestDlg*)AfxGetApp()->GetMainWnd();
    dlg->MessageBox("服务器已停止");
}
这是服务器的启动和关闭的代码,
已经解决了连接数的问题,但是我在服务器停止,退出后会出现错误,是不是handle_close()的问题?
找了半天没找到解决办法。

psycheqiqi 发表于 2009-9-22 14:01:57

回复 #16 psycheqiqi 的帖子

解决了。唉!!!

select_reactor连接数超过1000后效率要比proactor的差多少?

modern 发表于 2009-9-22 14:30:46

机制上来说是天差地别,
但是最主要还是看框架的设计,
系统设计做的不好,
用Proactor异或Epoll性能也上不去。

如果考虑到网络并发,一定表用Select_Reactor,
ICOP与Epoll在各自平台上都有非常好的并发性能表现。

另外选择TP_Reactor用好了1000以下性能也不赖。
而且最重要的是都是基于Select函数,跨平台后行为基本上是一致的。

psycheqiqi 发表于 2009-9-23 09:05:32

回复 #18 modern 的帖子

我做的都是在windows下的,是不是最好改成Proactor的

做的最多的就是服务器给很多客户端传文件,为什么不能用Select_Reactor,效率很低?

winston 发表于 2009-9-23 10:07:02

select_reactor在大连接下面效率差,这是公认的事情。
windows下服务器端,首选Proactor框架。
页: 1 [2] 3
查看完整版本: REACTOR模式下一个服务器最多连接多少客户端?