ACE_OS::closesocket(this->handle())无法关闭套接字
我使用的MFC的多文档视图+Proactor框架,每个视图里面都打开一个ACE_Task线程,都创建一个新的proactor (proactor_ = new ACE_Proactor();),给这个线程里的异步IO类使用,
在线程里,建立一个Asynch_Connector,事件处理器是Service_Handler.
我给ACE_Task类加了一个stop函数,
void WL_ServerTask::stop(void)
{
proactor_->proactor_end_event_loop();
}
一旦调用这个函数,svc函数里就会把connector关闭销毁,
int WL_CA_ServerTask::svc(void)
{
................
..................
proactor_->proactor_run_event_loop();
if (as_connector_ != NULL)
{
as_connector_->cancel();
delete as_connector_;
as_connector_= NULL;
}
return 0;
}
connector销毁时,会把曾用它作为连接器的所有事件处理器Service_Handler也关闭,
问题是,客户端这边的事件处理器Service_Handler,在它销毁时,确实调用了
ACE_OS::closesocket(this->handle());
handle(ACE_INVALID_HANDLE);
(Debug跟踪的,肯定调用了这一句)
可是与服务器端的连接还存在,未断开,
只有在整个客户端程序全部关闭时,与服务器端的连接才断开,
:( 大家有没有看出问题出在哪啊?
另外如果那个proactor不自行创建,而是使用ACE_Proactor::instance()就能正常关闭了,
但是会有问题: 一个视图调用了stop函数,其他的视图会把连接都停止;
求助求助 而且使用自行创建的proactor_
proactor_= new ACE_Proactor(),
........
proactor_->proactor_run_event_loop();
好像整个框架根本就没运行起来,消息发送不出
proactor_= ACE_Proactor::instance();
........
proactor_->proactor_run_event_loop();
这个是正常的,消息能发送出去
大家帮忙想个:每个ACE_Task线程单独使用一个proactor框架,他们之间互不影响? 很疑惑,我没看明白你的问题是什么。。。汗啊。。。 我好像是没说明白:L ,我再解释解释.
现在我准备开多个线程,每个线程之间相互独立的,
1: 线程函数如下:
int WL_CA_ServerTask::svc(void)
{
as_connector_ = new WL_AS_Connector(pMFCWnd_,proactor_);
as_connector_->open();
int errorno = as_connector_->connect(as_addr_);
proactor_->proactor_run_event_loop();
return 0;
}
WL_AS_Connector是继承至ACE_Asynch_Connector的类,as_connector_是它的一个对象;
as_addr_是ACE_INET_Addr对象;
proactor是ACE_Proactor对象;
2: 另外我还要使MFC主线程能够关闭这些线程,所以又提供了一个stop函数:
void WL_CA_ServerTask::stop(void)
{
proactor_->proactor_end_event_loop();
}
现在按照proactor_实现有三种路径:
1>原先Proactor框架一般使用的都是ACE_Proactor:instance(), proactor_为指向它的一个指针,
问题出来了,一旦一个线程调用了stop函数,其他线程都停止了,因为都指向了一个proactor;
2>所以我打算每个线程都建立自己的ACE_Proactor:proactor_ = new ACE_Proactor();,但是按照这样建立的框架,好像根本就没运作起来:能建立网络连接,但是好像发送不了消息,异步完成事件都没发生.
PS:这个线程里面的connnector\handler,我都指定了使用proactor_作为它的前摄器.
3> ACE_WIN32_Proactor* winImp = new ACE_WIN32_Proactor;
proactor_ =new ACE_Proactor(winImp ,0);
这样建立的话,程序会崩溃.
所以求救,整个实验室就我一个人学ace,也不知道问谁呢-_-!!
我想要实现的是:
建立多线程;
每个线程(作为发送端使用)都有自己的ace_proactor,proactor的end和run不影响其他的线程;
每个线程都能被终止;
[ 本帖最后由 Jekin 于 2009-5-21 19:16 编辑 ] 你终于说明白了。 给你解释一下:
1、系统中运行多个Proactor实例,一般来说是毫无必要的。一个就成。所以,完全可以用那个单体。
2、可以有很多线程同时跑Proactor框架,这里面有个概念很绕人,请搜索一下论坛,我有说明和解释。
3、每个建立的连接对,都是一个对象,不一定是什么线程运行它,但是毫无关系,它自己可以随意收发信息、关闭。
我相信你对Proactor的理解还没深刻,仔细想想,不明白再问大家。
页:
[1]