Force sleep to ignore interrupts

andychambers2002 at yahoo.co.uk andychambers2002 at yahoo.co.uk
Thu Sep 14 06:48:04 EDT 2006


I've written a simple Timer class that allows you to extend it
and then implement onMinuteChange, onHourChange etc methods
which will be executed on each new minute/hour respectively.

It works as I want when used in the main application thread.
That is, when you hit Ctr + C, it stops running.  However, if
the class that subclasses it, also subclasses Thread, it breaks
in that hitting Ctrl + C interrupts the call to sleep which puts
the event loop out of sync with real time.

How can I force the sleep to stay asleep for a whole second?  The
source code is below.


from threading import Thread
from datetime import datetime
from time import sleep

new_minute = lambda t: t.second == 0
new_hour = lambda t: t.minute == 0 and new_minute(t)
new_day = lambda t: t.hour == 0 and new_hour(t)
new_week = lambda t: t.weekday() == 0 and new_day(t)
new_month = lambda t: t.day == 0 and new_day(t)

class Timer:

    def run(self):
        t = datetime.now()
        diff = t.microsecond
        delay = 1.000000 - (0.000001 * diff)
        sleep(delay)
        self.onSecondChange()
        while True:
            sleep(1)
            t = datetime.now()
            self.onSecondChange()
            if new_minute(t): self.onMinuteChange()
            if new_hour(t): self.onHourChange()
            if new_day(t): self.onDayChange()
            if new_week(t): self.onWeekChange()
            if new_month(t): self.onMonthChange()

    def onSecondChange(self): pass
    def onMinuteChange(self): pass
    def onHourChange(self): pass
    def onDayChange(self): pass
    def onWeekChange(self): pass
    def onMonthChange(self): pass
    def onYearChange(self): pass


if __name__ == '__main__':
    class TestTimer(Timer, Thread):
        def onSecondChange(self):
            print "second elapse: %s" % datetime.now()
        def onMinuteChange(self):
            print "minute elapse : %s" % datetime.now()
        def onHourChange(self):
            print "hour elapse : %s" % datetime.now()
    t = TestTimer()
    t.start()




More information about the Python-list mailing list