don't sleep too long to avoid missing the timers; added a simple test for timer events processing in console apps

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56537 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2008-10-27 22:04:42 +00:00
parent fadc2df682
commit 438febca6e
8 changed files with 170 additions and 12 deletions

View File

@ -148,18 +148,6 @@ bool wxConsoleEventLoop::Pending() const
}
bool wxConsoleEventLoop::Dispatch()
{
m_dispatcher->Dispatch();
wxTheApp->ProcessPendingEvents();
return true;
}
void wxConsoleEventLoop::WakeUp()
{
m_wakeupPipe.WakeUp();
}
void wxConsoleEventLoop::OnNextIteration()
{
// calculate the timeout until the next timer expiration
int timeout;
@ -183,6 +171,17 @@ void wxConsoleEventLoop::OnNextIteration()
wxTimerScheduler::Get().NotifyExpired();
#endif
wxTheApp->ProcessPendingEvents();
return true;
}
void wxConsoleEventLoop::WakeUp()
{
m_wakeupPipe.WakeUp();
}
void wxConsoleEventLoop::OnNextIteration()
{
// call the signal handlers for any signals we caught recently
wxTheApp->CheckSignal();
}

View File

@ -60,6 +60,7 @@ TEST_OBJECTS = \
test_cmdlinetest.o \
test_fileconf.o \
test_datetimetest.o \
test_timertest.o \
test_filekind.o \
test_filenametest.o \
test_filesystest.o \
@ -365,6 +366,9 @@ test_fileconf.o: $(srcdir)/config/fileconf.cpp $(TEST_ODEP)
test_datetimetest.o: $(srcdir)/datetime/datetimetest.cpp $(TEST_ODEP)
$(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/datetime/datetimetest.cpp
test_timertest.o: $(srcdir)/events/timertest.cpp $(TEST_ODEP)
$(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/events/timertest.cpp
test_filekind.o: $(srcdir)/filekind/filekind.cpp $(TEST_ODEP)
$(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/filekind/filekind.cpp

139
tests/events/timertest.cpp Normal file
View File

@ -0,0 +1,139 @@
///////////////////////////////////////////////////////////////////////////////
// Name: tests/events/timertest.cpp
// Purpose: Test wxTimer events
// Author: Vadim Zeitlin
// Created: 2008-10-22
// RCS-ID: $Id$
// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "testprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#endif // WX_PRECOMP
#include <time.h>
#include "wx/evtloop.h"
#include "wx/timer.h"
// helper class counting the number of timer events
class TimerCounterHandler : public wxEvtHandler
{
public:
TimerCounterHandler()
{
m_events = 0;
Connect(wxEVT_TIMER, wxTimerEventHandler(TimerCounterHandler::OnTimer));
}
int GetNumEvents() const { return m_events; }
private:
void OnTimer(wxTimerEvent& WXUNUSED(event))
{
m_events++;
Tick();
}
virtual void Tick() { /* nothing to do in the base class */ }
int m_events;
DECLARE_NO_COPY_CLASS(TimerCounterHandler)
};
// --------------------------------------------------------------------------
// test class
// --------------------------------------------------------------------------
class TimerEventTestCase : public CppUnit::TestCase
{
public:
TimerEventTestCase() {}
private:
CPPUNIT_TEST_SUITE( TimerEventTestCase );
CPPUNIT_TEST( OneShot );
CPPUNIT_TEST( Multiple );
CPPUNIT_TEST_SUITE_END();
void OneShot();
void Multiple();
DECLARE_NO_COPY_CLASS(TimerEventTestCase)
};
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( TimerEventTestCase );
// also include in it's own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TimerEventTestCase, "TimerEventTestCase" );
void TimerEventTestCase::OneShot()
{
class ExitOnTimerHandler : public TimerCounterHandler
{
public:
ExitOnTimerHandler(wxEventLoopBase& loop)
: TimerCounterHandler(),
m_loop(loop)
{
}
private:
virtual void Tick() { m_loop.Exit(); }
wxEventLoopBase& m_loop;
// don't use DECLARE_NO_COPY_CLASS() to avoid upsetting MSVC
};
wxEventLoop loop;
ExitOnTimerHandler handler(loop);
wxTimer timer(&handler);
timer.Start(200, true);
loop.Run();
CPPUNIT_ASSERT_EQUAL( 1, handler.GetNumEvents() );
}
void TimerEventTestCase::Multiple()
{
wxEventLoop loop;
TimerCounterHandler handler;
wxTimer timer(&handler);
timer.Start(100);
// run the loop for 2 seconds
time_t t;
time(&t);
const time_t tEnd = t + 2;
while ( time(&t) < tEnd )
{
loop.Dispatch();
}
// we can't count on getting exactly 20 ticks but we shouldn't get more
// than this
const int numTicks = handler.GetNumEvents();
CPPUNIT_ASSERT( numTicks <= 20 );
// and we should get a decent number of them (unless the system is horribly
// loaded so if it does happen that this test fails we may need to remove
// it)
CPPUNIT_ASSERT( numTicks > 10 );
}

View File

@ -37,6 +37,7 @@
cmdline/cmdlinetest.cpp
config/fileconf.cpp
datetime/datetimetest.cpp
events/timertest.cpp
filekind/filekind.cpp
filename/filenametest.cpp
filesys/filesystest.cpp

View File

@ -417,6 +417,10 @@ SOURCE=.\streams\textstreamtest.cpp
# End Source File
# Begin Source File
SOURCE=.\events\timertest.cpp
# End Source File
# Begin Source File
SOURCE=.\thread\tls.cpp
# End Source File
# Begin Source File

View File

@ -732,6 +732,9 @@
<File
RelativePath=".\streams\textstreamtest.cpp">
</File>
<File
RelativePath=".\events\timertest.cpp">
</File>
<File
RelativePath=".\thread\tls.cpp">
</File>

View File

@ -1055,6 +1055,10 @@
RelativePath=".\streams\textstreamtest.cpp"
>
</File>
<File
RelativePath=".\events\timertest.cpp"
>
</File>
<File
RelativePath=".\thread\tls.cpp"
>

View File

@ -1027,6 +1027,10 @@
RelativePath=".\streams\textstreamtest.cpp"
>
</File>
<File
RelativePath=".\events\timertest.cpp"
>
</File>
<File
RelativePath=".\thread\tls.cpp"
>