我使用的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函数,其他的视图会把连接都停止;
求助求助 |