|
我在MFC中使用Proactor,把连接语句放在了线程函数中,接下来就是运行事件循环(因为客户端需要好几个连接,而每个连接又要单独控制,所以连接时传入了一个new的Proactor指针,以便在处理类中通过this->proactor()->proactor_end_event_loop()来结束该连接对应的事件循环,从而关闭连接线程)。连接线程函数如下:
void * CPro_mfc_serverDlg::TransFile_SenderProc(void * szServerIP)
{
CString Ip=*((CString *)szServerIP);
ACE_Proactor *p1=new ACE_Proactor;
ACE_Proactor::instance(p1, 1);
ACE_INET_Addr addr(LISTEN_PORT2,Ip);
ACE_Asynch_Connector<TransFile_Sender> connector;
if (connector.open (1, p1, 1) != 0)
{
AfxMessageBox("Connector::open failed");
delete p1;
return 0;
}
if(connector.connect(addr)==-1)
{
AfxMessageBox("Connection failed");
delete p1;
return 0;
}
ACE_Proactor::instance()->proactor_reset_event_loop(); //重新启动事件循环
ACE_Proactor::instance()->proactor_run_event_loop();
delete p1;
AfxMessageBox("发送线程关了"); //测试用
return 0;
}
线程开启语句
ACE_Thread::spawn((ACE_THR_FUNC)TransFile_SenderProc,(void *)&m_Server_IP,THR_DETACHED,&t_id); //开辟发送文件线程
现在的问题是:
如果在该连接的处理类的析构中用this->proactor()->proactor_end_event_loop();关闭了对应的事件循环,线程会正确关闭,此时也没有错误,但在程序关闭时运行ACE::fini();释放资源时会出现错误(发送不发送的那种错误),如果隐掉ACE::fini();则没有什么错误,但心里不踏实,因为MFC程序必须要调用ACE::fini();
如果在连接处理类的析构中不停止对应的事件循环,那么在关闭时调用ACE::fini();释放资源不会有错误发生,但这样的话由于没有结束循环,连接线程就不会关闭。不知这样的问题如何解决? |
|