Posted on 2009-03-04 08:48
S.l.e!ep.¢% 阅读(1719)
评论(4) 编辑 收藏 引用 所属分类:
C++
在一个界面中的按钮事件中需要向 所有在线的服务器 发送信息
void Dialog::Button_Click()
{
map <unsigned long, CServer*>::iterator iter;
for ( iter = m_OnLineServers.begin(); iter != m_OnLineServers.end(); iter++ )
{
iter->second->sendMsg();
}
}
所有 在线服务器 都存放在 m_OnLineServers 这个列表中,这个列表是一个 std::map
sendMsg() 内部又调用了 SOCKET 函数的 send
当 send 执行失败时, 会通知 Dialog 的 OnServerClose() 事件
void Dialog::OnServerClose(int nIndex)
{
map <unsigned long, CServer*>::iterator iter = m_OffLineServers.find(nIndex);
if ( iter != m_OffLineServers.end() )
{
m_OffLineServers.insert(make_pair<unsigned long, CServer*>(nIndex, iter_find->second));
m_OnLineServers.erase(nIndex);
}
OnServerClose() 事件需要把 CServer 从 Online 列表中删除, 跟着添加到 OffLine 列表
结合起来看,就会出现在同一条线程中
遍历 map
{
删除 map 元素
}
google了一下,网友们在遍历的过程中删除元素的方法是
for(iter = list.begin(); iter != list.end();)
{
if (shouldDelete(*iter))
iter = list.erase(iter);
else
++iter;
}
似乎能解决问题,
但从上面的逻辑来看, 遍历跟删除, 分别是在两个不同的类, 这样一来逻辑就复杂多了
通常BUG都是因为复杂的逻辑而产生的。