[Tutor] Making a function run every second.
Dave Angel
d at davea.name
Tue Nov 29 18:46:40 CET 2011
On 11/29/2011 11:09 AM, Dave Angel wrote:
> On 11/29/2011 10:52 AM, Mic wrote:
>>
>> <SNIP>
>> Okay, I undestand. Hmm, what is a drift?
>>
I just noticed I hadn't answered that one. It doesn't matter any more
since you're running tkinter.
But for completeness:
If you had a non-event driven program (eg. a console app), and you had a
loop like the following:
SLEEPTIME = 1
while True:
sleep(SLEEPTIME)
myfunc()
myfunc() would be called about once a second. However, in a heavily
loaded system, it might be 1.2 seconds one time, and 1.1 the next. So
it might be called only 50 times in that minute, rather than 60. I
believe that in some OS's, it might be called 75 times in a minute.
Anyway, if drift is to be avoided, you need to keep track of the time
that the next call should be made, compare it to "now", and calculate
what to pass as a parameter to sleep().
In untested approx. code,
import time
import itertools
starttime = float(now())
SLEEPTIME = 1 (for one second)
for intervalnum in itertools.count():
delayneeded = starttime + SLEEPTIME*intervalnum - now()
time.sleep(delayneeded)
myfunc()
if this drifts, it tries to compensate on the next iteration. Note that
there are cleverer implementations of this fundamental scheme, depending
on other requirements or goals.
--
DaveA
More information about the Tutor
mailing list