[Tutor] Reusing Timers (threading.timer)

Steven D'Aprano steve at pearwood.info
Wed Nov 14 00:50:51 CET 2012


On 14/11/12 02:42, Patrick Dickey wrote:
> Hi everyone,
>
> I've got an application that will use a timer to run a function
> automatically (it's an update function for my IPv6 endpoint). The
> questions that I have are these:

Have you read the documentation?

http://docs.python.org/2/library/threading.html#timer-objects

> 1.  Can I stop and start the timer from different functions or methods
> in my program, and if so, how?

As the docs say:

[quote]
Timers are started, as with threads, by calling their start() method.
The timer can be stopped (before its action has begun) by calling
the cancel() method.
[end quote]

Any function or method that has access to the timer object can call
the start or cancel method. You just need to make sure that the
function can see the timer object, using one of the standard ways
in Python of giving a function access to any other object:

* (best) pass the object into the function as an argument

   result = myfunction(a, b, c, some_timer)

* (easiest) make the timer a global variable

* put the timer inside a dict, list or other container and
   pass it to the function

* put the timer in an attribute of the object

etc.



> 2.  Can I stop the timer, change the value, and restart it (or would it
> create a new timer), or do I have to create a new timer with an entirely
> new name?

Changing the timer is not supported. I expect that calling my_timer.start()
after cancelling it would restart it, but haven't tested it.

Just because you create a new timer doesn't mean you have to give it an
entirely new name.


> 3.  If I get a value from a textbox, how do I parse it from the string
> value to an integer (or float)?

This has nothing to do with timers, and should go into a separate email
thread so that those people who know nothing about threading can contribute.

Regardless of where the string comes from, you turn a string into an int or
float by calling the int() or float() function.


> 4.  Is there a better way of accomplishing this task?
>
> Here's the pseudocode for what I'm doing.
>
> if autoUpdates is enabled
>     get updateFrequency
>     start timer with time value from updateFrequency
>     when time is reached, run update method
> else
>     cancel timer


Well that won't work, because once the update has run, it will stop
checking for new updates.


> if autoUpdates is enabled AND user changes updateFrequency
>     stop timer
>     get updateFrequency
>     start timer with new time value from updateFrequency

Seems fine to me.



-- 
Steven


More information about the Tutor mailing list