回复 #10 modern 的帖子
ACE_Dev_Poll_Reactor无法在windows上运行,但改成能在windows上运行的代码,就2、3行而已,顶多加载一个宏定义我在论坛里看的帖子这么说的
如果不支持的话那么只能改成proactor?
回复 #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;时程序运行出错,为什么? 恩,问问题之前看前人的帖子是个好习惯,
不过我认为磨刀不费砍材功,
楼主最好先看看书,不用多,就看C++NPV2第四章就成。
楼主遇到的问题,书上都已经给出明确的解释了。
让我们说也是复制一遍书上的内容。 原帖由 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 ...
为什么会出错呢,看了书也没找到答案
回复 #14 psycheqiqi 的帖子
找到了。设置Enable Run-Time Type Infomation(RTTI)回复 #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()的问题?
找了半天没找到解决办法。
回复 #16 psycheqiqi 的帖子
解决了。唉!!!select_reactor连接数超过1000后效率要比proactor的差多少? 机制上来说是天差地别,
但是最主要还是看框架的设计,
系统设计做的不好,
用Proactor异或Epoll性能也上不去。
如果考虑到网络并发,一定表用Select_Reactor,
ICOP与Epoll在各自平台上都有非常好的并发性能表现。
另外选择TP_Reactor用好了1000以下性能也不赖。
而且最重要的是都是基于Select函数,跨平台后行为基本上是一致的。
回复 #18 modern 的帖子
我做的都是在windows下的,是不是最好改成Proactor的做的最多的就是服务器给很多客户端传文件,为什么不能用Select_Reactor,效率很低? select_reactor在大连接下面效率差,这是公认的事情。
windows下服务器端,首选Proactor框架。