void Client::OnWorkerEvent(WorkerEvent& pEvent) { switch (pEvent.m_eventType) { case WorkerEvent::CONNECTING: if (pEvent.isFailed()) { m_statConnecting--; m_statFailed++; } break; case WorkerEvent::SENDING: if (pEvent.isFailed()) { m_statFailed++; m_statSending--; } else { m_statConnecting--; m_statSending++; } break; case WorkerEvent::RECEIVING: if (pEvent.isFailed()) { m_statReceiving--; m_statFailed++; } else { m_statSending--; m_statReceiving++; } break; case WorkerEvent::DISCONNECTING: if (pEvent.isFailed()) { m_statDisconnecting--; m_statFailed++; } else { m_statReceiving--; m_statDisconnecting++; } break; case WorkerEvent::DONE: m_statDone++; m_statDisconnecting--; break; }; if (pEvent.isFailed() || pEvent.m_eventType == WorkerEvent::DONE) { for(TList::compatibility_iterator it = m_threadWorkers.GetFirst(); it ; it = it->GetNext()) { if (it->GetData() == pEvent.m_sender) { m_threadWorkers.DeleteNode(it); break; } } for(EList::compatibility_iterator it2 = m_eventWorkers.GetFirst(); it2 ; it2 = it2->GetNext()) { if (it2->GetData() == pEvent.m_sender) { delete it2->GetData(); m_eventWorkers.DeleteNode(it2); break; } } if ((m_threadWorkers.GetCount() == 0) && (m_eventWorkers.GetCount() == 0)) { mTimer.Stop(); dumpStatistics(); wxSleep(2); ExitMainLoop(); } else { mTimer.Start(timeout_val,true); } } }