X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9c824f2977a2e8a502b0570c5301caa2a547833a..3ba18664fc65e3494695bbd57250bcee36625c91:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index 67cec8530c..767ce02e29 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -9,9 +9,9 @@ // Modified by: // 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 ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -36,6 +36,7 @@ #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/log.h" + #include "wx/thread.h" #endif #include "wx/timer.h" @@ -49,10 +50,22 @@ #include #endif -#if defined(__WIN32__) && !defined(HAVE_FTIME) +#if defined(__WIN32__) && !defined(HAVE_FTIME) && !defined(__MWERKS__) #define HAVE_FTIME #endif +#if defined(__VISAGECPP__) && !defined(HAVE_FTIME) + #define HAVE_FTIME +# if __IBMCPP__ >= 400 + # define ftime(x) _ftime(x) +# endif +#endif + +#if defined(__MWERKS__) && defined(__WXMSW__) +# undef HAVE_FTIME +# undef HAVE_GETTIMEOFDAY +#endif + #include #ifndef __WXMAC__ #include // for time_t @@ -65,11 +78,15 @@ #include #endif +#ifdef __WXMAC__ + #include + #include +#endif // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- -#if wxUSE_GUI +#if wxUSE_GUI && wxUSE_TIMER IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent) #endif // wxUSE_GUI @@ -88,12 +105,6 @@ #endif #endif // HAVE_GETTIMEOFDAY -// ---------------------------------------------------------------------------- -// prototypes -// ---------------------------------------------------------------------------- - -wxLongLong wxGetLocalTimeMillis(); - // ============================================================================ // implementation // ============================================================================ @@ -102,7 +113,12 @@ wxLongLong wxGetLocalTimeMillis(); // wxTimerBase // ---------------------------------------------------------------------------- -#if wxUSE_GUI +#if wxUSE_GUI && wxUSE_TIMER + +wxTimerBase::~wxTimerBase() +{ + // this destructor is required for Darwin +} void wxTimerBase::Notify() { @@ -114,32 +130,66 @@ void wxTimerBase::Notify() (void)m_owner->ProcessEvent(event); } +bool wxTimerBase::Start(int milliseconds, bool oneShot) +{ + // 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() ) + { + // 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(); + } + + if ( milliseconds != -1 ) + { + m_milli = milliseconds; + } + + m_oneShot = oneShot; + + return TRUE; +} + #endif // wxUSE_GUI // ---------------------------------------------------------------------------- // wxStopWatch // ---------------------------------------------------------------------------- +#if wxUSE_LONGLONG + void wxStopWatch::Start(long t) { m_t0 = wxGetLocalTimeMillis() - t; m_pause = 0; + m_pauseCount = 0; } long wxStopWatch::GetElapsedTime() const { - return (wxGetLocalTimeMillis() - m_t0).GetLo(); + return (wxGetLocalTimeMillis() - m_t0).GetLo(); } long wxStopWatch::Time() const { - return (m_pause ? m_pause : GetElapsedTime()); + return m_pauseCount ? m_pause : GetElapsedTime(); } +#endif // wxUSE_LONGLONG + // ---------------------------------------------------------------------------- // old timer functions superceded by wxStopWatch // ---------------------------------------------------------------------------- +#if wxUSE_LONGLONG + static wxLongLong wxStartTime = 0l; // starts the global timer @@ -160,6 +210,7 @@ long wxGetElapsedTime(bool resetTimer) return (newTime - oldTime).GetLo(); } +#endif // wxUSE_LONGLONG // ---------------------------------------------------------------------------- // the functions to get the current time and timezone info @@ -199,7 +250,8 @@ long wxGetLocalTime() // Get UTC time as seconds since 00:00:00, Jan 1st 1970 long wxGetUTCTime() { - struct tm tm, *ptm; + struct tm tm; + struct tm *ptm; time_t t0, t1; // This cannot be made static because mktime can overwrite it @@ -245,16 +297,34 @@ long wxGetUTCTime() return -1; } +#if wxUSE_LONGLONG // 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 possible, use a function which avoids conversions from + // broken-up time structures to milliseconds -#if defined(HAVE_GETTIMEOFDAY) +#if defined(__WXMSW__) && defined(__MWERKS__) + // This should probably be the way all WXMSW compilers should do it + // Go direct to the OS for time + + SYSTEMTIME thenst = { 1970, 1, 4, 1, 0, 0, 0, 0 }; // 00:00:00 Jan 1st 1970 + FILETIME thenft; + SystemTimeToFileTime( &thenst, &thenft ); + wxLongLong then( thenft.dwHighDateTime, thenft.dwLowDateTime ); // time in 100 nanoseconds + + SYSTEMTIME nowst; + GetLocalTime( &nowst ); + FILETIME nowft; + SystemTimeToFileTime( &nowst, &nowft ); + wxLongLong now( nowft.dwHighDateTime, nowft.dwLowDateTime ); // time in 100 nanoseconds + + return ( now - then ) / 10000.0; // time from 00:00:00 Jan 1st 1970 to now in milliseconds + +#elif defined(HAVE_GETTIMEOFDAY) struct timeval tp; if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 ) { @@ -274,7 +344,27 @@ wxLongLong wxGetLocalTimeMillis() (void)ftime(&tp); val *= tp.time; return (val + tp.millitm); -#else +#elif defined(__WXMAC__) + + static UInt64 gMilliAtStart = 0; + + Nanoseconds upTime = AbsoluteToNanoseconds( UpTime() ); + + if ( gMilliAtStart == 0 ) + { + time_t start = time(NULL); + gMilliAtStart = ((UInt64) start) * 1000000L; + gMilliAtStart -= upTime.lo / 1000 ; + gMilliAtStart -= ( ( (UInt64) upTime.hi ) << 32 ) / (1000 * 1000); + } + + UInt64 millival = gMilliAtStart; + millival += upTime.lo / (1000 * 1000); + millival += ( ( (UInt64) upTime.hi ) << 32 ) / (1000 * 1000); + val = millival; + + return val; +#else // no gettimeofday() nor ftime() // We use wxGetLocalTime() to get the seconds since // 00:00:00 Jan 1st 1970 and then whatever is available // to get millisecond resolution. @@ -285,22 +375,34 @@ wxLongLong wxGetLocalTimeMillis() val *= wxGetLocalTime(); -#if defined(__VISAGECPP__) - DATETIME dt; - ::DosGetDateTime(&dt); - val += (dt.hundredths*10); -#elif defined (__WIN32__) -#warning "Possible clock skew bug in wxStopWatch!" +// GRG: This will go soon as all WIN32 seem to have ftime +#if defined (__WIN32__) + // If your platform/compiler needs to use two different functions + // to get ms resolution, please do NOT just shut off these warnings, + // drop me a line instead at + #warning "Possible clock skew bug in wxGetLocalTimeMillis()!" + SYSTEMTIME st; ::GetLocalTime(&st); val += st.wMilliseconds; -#else -#if !defined(__VISUALC__) && !defined(__BORLANDC__) -#warning "wxStopWatch will be up to second resolution!" -#endif +#else // !Win32 + // If your platform/compiler does not support ms resolution please + // do NOT just shut off these warnings, drop me a line instead at + // + + #if defined(__VISUALC__) || defined (__WATCOMC__) + #pragma message("wxStopWatch will be up to second resolution!") + #elif defined(__BORLANDC__) + #pragma message "wxStopWatch will be up to second resolution!" + #else + #warning "wxStopWatch will be up to second resolution!" + #endif // compiler #endif return val; -#endif +#endif // time functions } + +#endif // wxUSE_LONGLONG +