Posted on 2009-03-04 08:48
S.l.e!ep.¢% 閱讀(1729)
評論(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都是因為復雜的邏輯而產生的。