bool wxTimer::Start( int nMilliseconds , bool bOneShot ) { (void)wxTimerBase::Start( nMilliseconds ,bOneShot ); wxCHECK_MSG( m_milli > 0L, FALSE, wxT("invalid value for timer") ); wxWindow* pWin = NULL; if (m_owner) { pWin = (wxWindow*)m_owner; m_ulId = ::WinStartTimer( m_Hab ,pWin->GetHWND() ,m_idTimer ,(ULONG)nMilliseconds ); } else m_ulId = ::WinStartTimer( m_Hab ,NULLHANDLE ,0 ,(ULONG)nMilliseconds ); if (m_ulId > 0L) { // check that SetTimer() didn't reuse an existing id: according to // the MSDN this can happen and this would be catastrophic to us as // we rely on ids uniquely identifying the timers because we use // them as keys in the hash if ( TimerMap().find(m_ulId) != TimerMap().end() ) { wxLogError(_("Timer creation failed.")); ::WinStopTimer(m_Hab, pWin?(pWin->GetHWND()):NULL, m_ulId); m_ulId = 0; return false; } TimerMap()[m_ulId] = this; return true; } else { wxLogSysError(_("Couldn't create a timer")); return(FALSE); } }
// This gets a unique, non-zero timer ID and creates an entry in the TimerMap UINT_PTR GetNewTimerId(wxMSWTimerImpl *t) { static UINT_PTR lastTimerId = 0; while (lastTimerId == 0 || TimerMap().find(lastTimerId) != TimerMap().end()) { lastTimerId = lastTimerId + 1; } TimerMap()[lastTimerId] = t; return lastTimerId; }
ULONG wxTimerProc( HWND WXUNUSED(hwnd) , ULONG , int nIdTimer , ULONG ) { wxTimerMap::iterator node = TimerMap().find((ULONG)nIdTimer); wxCHECK_MSG(node != TimerMap().end(), 0, wxT("bogus timer id in wxTimerProc") ); wxProcessTimer(*(node->second)); return 0; }
void wxTimer::Stop() { if ( m_ulId ) { if (m_owner) { wxWindow* pWin = (wxWindow*)m_owner; ::WinStopTimer(m_Hab, pWin->GetHWND(), m_ulId); } else ::WinStopTimer(m_Hab, NULLHANDLE, m_ulId); TimerMap().erase(m_ulId); } m_ulId = 0L; }