X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/61a021a82283308e8544d45589c2d1b86afbd545..062b84dd49ed5d6f494727df9db9d43d20928dda:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index 5f6f2f05a7..2b310c0599 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -1,17 +1,13 @@ ///////////////////////////////////////////////////////////////////////////// // Name: common/timercmn.cpp -// Purpose: Common timer implementation -// Author: -// Original version by Julian Smart -// Vadim Zeitlin got rid of all ifdefs (11.12.99) -// Sylvain Bougnoux added wxStopWatch class -// Guillermo Rodriguez rewrote from scratch (Dic/99) -// Modified by: +// Purpose: wxTimerBase implementation +// Author: Julian Smart, Guillermo Rodriguez, Vadim Zeitlin +// Modified by: VZ: extracted all non-wxTimer stuff in stopwatch.cpp (20.06.03) // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem +// Copyright: (c) Julian Smart // (c) 1999 Guillermo Rodriguez -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -19,10 +15,10 @@ // ============================================================================ // ---------------------------------------------------------------------------- -// headers +// wxWin headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "timerbase.h" #endif @@ -33,68 +29,26 @@ #pragma hdrstop #endif -#ifndef WX_PRECOMP - #include "wx/intl.h" - #include "wx/log.h" -#endif - -#include "wx/timer.h" -#include "wx/longlong.h" - -#if defined(__WIN32__) - #include -#endif +#if wxUSE_TIMER -#include -#ifndef __WXMAC__ - #include // for time_t -#endif - -#if defined(HAVE_GETTIMEOFDAY) - #include - #include -#elif defined(HAVE_FTIME) - #include +#ifndef WX_PRECOMP + #include "wx/timer.h" #endif // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- -#if wxUSE_GUI - IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent) -#endif // wxUSE_GUI - -// ---------------------------------------------------------------------------- -// macros -// ---------------------------------------------------------------------------- - -// on some really old systems gettimeofday() doesn't have the second argument, -// define wxGetTimeOfDay() to hide this difference -#ifdef HAVE_GETTIMEOFDAY - #ifdef WX_GETTIMEOFDAY_NO_TZ - struct timezone; - #define wxGetTimeOfDay(tv, tz) gettimeofday(tv) - #else - #define wxGetTimeOfDay(tv, tz) gettimeofday((tv), (tz)) - #endif -#endif // HAVE_GETTIMEOFDAY - -// ---------------------------------------------------------------------------- -// prototypes -// ---------------------------------------------------------------------------- - -wxLongLong wxGetLocalTimeMillis(); +IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent) // ============================================================================ -// implementation +// wxTimerBase implementation // ============================================================================ -#if wxUSE_GUI - -// ---------------------------------------------------------------------------- -// wxTimerBase -// ---------------------------------------------------------------------------- +wxTimerBase::~wxTimerBase() +{ + // this destructor is required for Darwin +} void wxTimerBase::Notify() { @@ -103,182 +57,36 @@ void wxTimerBase::Notify() wxCHECK_RET( m_owner, _T("wxTimer::Notify() should be overridden.") ); wxTimerEvent event(m_idTimer, m_milli); + event.SetEventObject(this); (void)m_owner->ProcessEvent(event); } -#endif // wxUSE_GUI - -// ---------------------------------------------------------------------------- -// wxStopWatch -// ---------------------------------------------------------------------------- - -void wxStopWatch::Start(long t) -{ - m_t0 = wxGetLocalTimeMillis() - t; - m_pause = 0; -} - -long wxStopWatch::GetElapsedTime() const +bool wxTimerBase::Start(int milliseconds, bool oneShot) { - return (wxGetLocalTimeMillis() - m_t0).GetLo(); -} - -long wxStopWatch::Time() const -{ - return (m_pause ? m_pause : GetElapsedTime()); -} - -// ---------------------------------------------------------------------------- -// old timer functions superceded by wxStopWatch -// ---------------------------------------------------------------------------- - -static wxLongLong wxStartTime = 0l; - -// starts the global timer -void wxStartTimer() -{ - wxStartTime = wxGetLocalTimeMillis(); -} - -// Returns elapsed time in milliseconds -long wxGetElapsedTime(bool resetTimer) -{ - wxLongLong oldTime = wxStartTime; - wxLongLong newTime = wxGetLocalTimeMillis(); - - if ( resetTimer ) - wxStartTime = newTime; - - return (newTime - oldTime).GetLo(); -} - - -// ---------------------------------------------------------------------------- -// the functions to get the current time and timezone info -// ---------------------------------------------------------------------------- - -// Get local time as seconds since 00:00:00, Jan 1st 1970 -long wxGetLocalTime() -{ - struct tm tm; - time_t t0, t1; - - // This cannot be made static because mktime can overwrite it. - // - memset(&tm, 0, sizeof(tm)); - tm.tm_year = 70; - tm.tm_mon = 0; - tm.tm_mday = 5; // not Jan 1st 1970 due to mktime 'feature' - tm.tm_hour = 0; - tm.tm_min = 0; - tm.tm_sec = 0; - tm.tm_isdst = -1; // let mktime guess - - // Note that mktime assumes that the struct tm contains local time. - // - t1 = time(&t1); // now - t0 = mktime(&tm); // origin - - // Return the difference in seconds. - // - if (( t0 != (time_t)-1 ) && ( t1 != (time_t)-1 )) - return (long)difftime(t1, t0) + (60 * 60 * 24 * 4); - - wxLogSysError(_("Failed to get the local system time")); - return -1; -} - -// Get UTC time as seconds since 00:00:00, Jan 1st 1970 -long wxGetUTCTime() -{ - struct tm tm, *ptm; - time_t t0, t1; - - // This cannot be made static because mktime can overwrite it - // - memset(&tm, 0, sizeof(tm)); - tm.tm_year = 70; - tm.tm_mon = 0; - tm.tm_mday = 5; // not Jan 1st 1970 due to mktime 'feature' - tm.tm_hour = 0; - tm.tm_min = 0; - tm.tm_sec = 0; - tm.tm_isdst = -1; // let mktime guess - - // Note that mktime assumes that the struct tm contains local time. - // - t1 = time(&t1); // now - t0 = mktime(&tm); // origin in localtime - - if (( t0 != (time_t)-1 ) && ( t1 != (time_t)-1 )) + // under MSW timers only work when they're started from the main thread so + // let the caller know about it +#if wxUSE_THREADS + wxASSERT_MSG( wxThread::IsMain(), + _T("timer can only be started from the main thread") ); +#endif // wxUSE_THREADS + + if ( IsRunning() ) { - // To get t0 as GMT we convert to a struct tm with gmtime, - // and then back again. - // - ptm = gmtime(&t0); - - if (ptm) - { - memcpy(&tm, ptm, sizeof(tm)); - t0 = mktime(&tm); - - if (t0 != (time_t)-1 ) - return (long)difftime(t1, t0) + (60 * 60 * 24 * 4); - wxLogSysError(_("Failed 2nd mktime")); - } - wxLogSysError(_("Failed gmtime")); + // not stopping the already running timer might work for some + // platforms (no problems under MSW) but leads to mysterious crashes + // on the others (GTK), so to be on the safe side do it here + Stop(); } - wxLogSysError(_("Failed to get the UTC system time")); - return -1; -} - -// Get local time as milliseconds since 00:00:00, Jan 1st 1970 -wxLongLong wxGetLocalTimeMillis() -{ - wxLongLong val = 1000l; - - // If possible, use a functin which avoids conversions from - // broken-up time structures to milliseconds, - -#if defined(HAVE_GETTIMEOFDAY) - struct timeval tp; - if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 ) - { - val *= tp.tv_sec; - return (val + (tp.tv_usec / 1000)); - } - return 0; -#elif defined(HAVE_FTIME) - struct timeb tp; - if ( ftime(&tp) == 0 ) + if ( milliseconds != -1 ) { - val *= tp.time; - return (val + tp.millitm); + m_milli = milliseconds; } -#else - // We use wxGetLocalTime() to get the seconds since - // 00:00:00 Jan 1st 1970 and then whatever is available - // to get millisecond resolution. - // - // TODO: This might lead to a problem if the clocks use - // different sources. - val *= wxGetLocalTime(); + m_oneShot = oneShot; -#if defined (__WIN32__) - SYSTEMTIME st; - ::GetLocalTime(&st); - val += st.wMilliseconds; -#elif defined(__VISAGECPP__) - DATETIME dt; - ::DosGetDateTime(&dt); - val += (dt.hundredths*10); -#else -#warning "wxStopWatch will be up to second resolution!" -#endif + return true; +} - return val; +#endif // wxUSE_TIMER -#endif -}