reset one shot timer internal state instead of leaving it thinking that it's still running (mdified patch 1730597)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46324 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-06-04 13:34:54 +00:00
parent c49f887978
commit 74e10fcc6a
3 changed files with 21 additions and 2 deletions

View File

@@ -31,10 +31,17 @@ public:
virtual bool Start(int milliseconds = -1, bool oneShot = false); virtual bool Start(int milliseconds = -1, bool oneShot = false);
virtual void Stop(); virtual void Stop();
// for wxTimerScheduler only: resets the internal flag indicating that the
// timer is running
void MarkStopped()
{
wxASSERT_MSG( m_isRunning, _T("stopping non-running timer?") );
m_isRunning = false;
}
private: private:
bool m_isRunning; bool m_isRunning;
friend class wxTimerScheduler;
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -27,6 +27,7 @@
#include "wx/log.h" #include "wx/log.h"
#include "wx/apptrait.h" #include "wx/apptrait.h"
#include "wx/platinfo.h" #include "wx/platinfo.h"
#include "wx/wxchar.h"
// without this pragma, the stupid compiler precompiles #defines below so that // without this pragma, the stupid compiler precompiles #defines below so that
// changing them doesn't "take place" later! // changing them doesn't "take place" later!
@@ -2958,6 +2959,7 @@ void TestTimer()
virtual void Notify() virtual void Notify()
{ {
wxPrintf(_T("%d"), m_num++); wxPrintf(_T("%d"), m_num++);
fflush(stdout);
if ( m_num == 10 ) if ( m_num == 10 )
{ {
@@ -2977,6 +2979,11 @@ void TestTimer()
wxEventLoop loop; wxEventLoop loop;
wxTimer timer1;
timer1.Start(100, true /* one shot */);
timer1.Stop();
timer1.Start(100, true /* one shot */);
MyTimer timer; MyTimer timer;
timer.Start(500); timer.Start(500);

View File

@@ -159,6 +159,11 @@ void wxTimerScheduler::NotifyExpired()
wxUnixTimerImpl * const timer = s->m_timer; wxUnixTimerImpl * const timer = s->m_timer;
if ( timer->IsOneShot() ) if ( timer->IsOneShot() )
{ {
// the timer needs to be stopped but don't call its Stop() from
// here as it would attempt to remove the timer from our list and
// we had already done it, so we just need to reset its state
timer->MarkStopped();
// don't need it any more // don't need it any more
delete s; delete s;
} }