Fix bug with wxStopWatch::Start() not resuming paused stopwatch any more.

Since r69835 the stop watch remained paused even when Start() was called. Do
resume it when restarting it both for backwards compatibility and because it
makes more sense and also document this behaviour.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69921 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2011-12-03 00:34:00 +00:00
parent 238188550e
commit 17d72a48ff
3 changed files with 37 additions and 3 deletions

View File

@ -61,6 +61,10 @@ public:
/**
(Re)starts the stop watch with a given initial value.
The stopwatch will always be running after calling Start(), even if
Pause() had been called before and even if it had been called multiple
times.
*/
void Start(long milliseconds = 0);

View File

@ -125,6 +125,10 @@ wxLongLong wxStopWatch::GetClockFreq() const
void wxStopWatch::Start(long t0)
{
// Calling Start() makes the stop watch run however many times it was
// paused before.
m_pauseCount = 0;
DoStart();
m_t0 -= (wxLongLong(t0)*GetClockFreq())/MILLISECONDS_PER_SECOND;

View File

@ -26,6 +26,14 @@
#include "wx/stopwatch.h"
#include "wx/utils.h"
namespace
{
const long tolerance = 10; // in ms
const int sleepTime = 500;
} // anonymous namespace
// --------------------------------------------------------------------------
// test class
// --------------------------------------------------------------------------
@ -39,10 +47,12 @@ private:
CPPUNIT_TEST_SUITE( StopWatchTestCase );
CPPUNIT_TEST( Misc );
CPPUNIT_TEST( BackwardsClockBug );
CPPUNIT_TEST( RestartBug );
CPPUNIT_TEST_SUITE_END();
void Misc();
void BackwardsClockBug();
void RestartBug();
DECLARE_NO_COPY_CLASS(StopWatchTestCase)
};
@ -55,8 +65,6 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( StopWatchTestCase, "StopWatchTestCase" );
void StopWatchTestCase::Misc()
{
static const long tolerance = 10; // in ms
wxStopWatch sw;
long t;
wxLongLong usec;
@ -81,7 +89,6 @@ void StopWatchTestCase::Misc()
t >= 0 && t < tolerance
);
static const int sleepTime = 500;
sw.Resume();
wxMilliSleep(sleepTime);
t = sw.Time();
@ -124,3 +131,22 @@ void StopWatchTestCase::BackwardsClockBug()
}
}
}
void StopWatchTestCase::RestartBug()
{
wxStopWatch sw;
sw.Pause();
// Calling Start() should resume the stopwatch if it was paused.
static const int offset = 5000;
sw.Start(offset);
wxMilliSleep(sleepTime);
long t = sw.Time();
WX_ASSERT_MESSAGE
(
("Actual time value is %ld", t),
t > offset + sleepTime - tolerance &&
t < offset + sleepTime + tolerance
);
}