X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8242fb3b6f9a46ec624c1a01daef8fde9b8bb19e..236a9de39afa090fdee3cf91cb5364ceca69e3f8:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index 15d1abc07e..f6148e0aa9 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -11,7 +11,7 @@ // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem // (c) 1999 Guillermo Rodriguez -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -19,7 +19,7 @@ // ============================================================================ // ---------------------------------------------------------------------------- -// headers +// wxWin headers // ---------------------------------------------------------------------------- #ifdef __GNUG__ @@ -41,10 +41,18 @@ #include "wx/timer.h" #include "wx/longlong.h" +// ---------------------------------------------------------------------------- +// System headers +// ---------------------------------------------------------------------------- + #if defined(__WIN32__) #include #endif +#if defined(__WIN32__) && !defined(HAVE_FTIME) + #define HAVE_FTIME +#endif + #include #ifndef __WXMAC__ #include // for time_t @@ -57,6 +65,14 @@ #include #endif +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent) +#endif // wxUSE_GUI + // ---------------------------------------------------------------------------- // macros // ---------------------------------------------------------------------------- @@ -72,11 +88,33 @@ #endif #endif // HAVE_GETTIMEOFDAY +// ---------------------------------------------------------------------------- +// prototypes +// ---------------------------------------------------------------------------- + +wxLongLong wxGetLocalTimeMillis(); + // ============================================================================ // implementation // ============================================================================ -wxLongLong wxGetLocalTimeMillis(); +// ---------------------------------------------------------------------------- +// wxTimerBase +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +void wxTimerBase::Notify() +{ + // the base class version generates an event if it has owner - which it + // should because otherwise nobody can process timer events + wxCHECK_RET( m_owner, _T("wxTimer::Notify() should be overridden.") ); + + wxTimerEvent event(m_idTimer, m_milli); + (void)m_owner->ProcessEvent(event); +} + +#endif // wxUSE_GUI // ---------------------------------------------------------------------------- // wxStopWatch @@ -85,13 +123,12 @@ wxLongLong wxGetLocalTimeMillis(); void wxStopWatch::Start(long t) { m_t0 = wxGetLocalTimeMillis() - t; - m_pause = 0; } -inline long wxStopWatch::GetElapsedTime() const +long wxStopWatch::GetElapsedTime() const { - return (wxGetLocalTimeMillis() - m_t0).GetLo(); + return (wxGetLocalTimeMillis() - m_t0).GetLo(); } long wxStopWatch::Time() const @@ -195,11 +232,16 @@ long wxGetUTCTime() if (t0 != (time_t)-1 ) return (long)difftime(t1, t0) + (60 * 60 * 24 * 4); - wxLogSysError(_("Failed 2nd mktime")); + wxLogSysError(_("mktime() failed")); + } + else + { + wxLogSysError(_("gmtime() failed")); } - wxLogSysError(_("Failed gmtime")); } - wxLogSysError(_("Failed to get the UTC system time")); + + wxLogError(_("Failed to get the UTC system time.")); + return -1; } @@ -207,35 +249,58 @@ long wxGetUTCTime() // Get local time as milliseconds since 00:00:00, Jan 1st 1970 wxLongLong wxGetLocalTimeMillis() { - // We use wxGetLocalTime() to get the seconds since - // 00:00:00 Jan 1st 1970 and then whatever is available - // to get millisecond resolution. - // wxLongLong val = 1000l; - val *= wxGetLocalTime(); - // If we got here, do not fail even if we can't get - // millisecond resolution. - // -#if defined(__WIN32__) - SYSTEMTIME st; - ::GetLocalTime(&st); - return (val + st.wMilliseconds); -#elif defined(HAVE_GETTIMEOFDAY) + // 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)); } -#elif defined(HAVE_FTIME) - struct timeb tp; - if ( ftime(&tp) == 0 ) + else { - return (val + tp.millitm); + wxLogError(_("wxGetTimeOfDay failed.")); + return 0; } +#elif defined(HAVE_FTIME) + struct timeb tp; + + // ftime() is void and not int in some mingw32 headers, so don't + // test the return code (well, it shouldn't fail anyhow...) + (void)ftime(&tp); + val *= tp.time; + return (val + tp.millitm); +#else + // We use wxGetLocalTime() to get the seconds since + // 00:00:00 Jan 1st 1970 and then whatever is available + // to get millisecond resolution. + // + // NOTE that this might lead to a problem if the clocks + // use different sources, so this approach should be + // avoided where possible. + + val *= wxGetLocalTime(); + +#if defined(__VISAGECPP__) + DATETIME dt; + ::DosGetDateTime(&dt); + val += (dt.hundredths*10); +#elif defined (__WIN32__) +#warning "Possible clock skew bug in wxStopWatch!" + SYSTEMTIME st; + ::GetLocalTime(&st); + val += st.wMilliseconds; #else +#ifndef __VISUALC__ #warning "wxStopWatch will be up to second resolution!" +#endif #endif return val; + +#endif }