Dup Ver Goto 📝

SimpleTimedEvents

PT2/lang/python/timer does not exist
To
104 lines, 258 words, 2259 chars Page 'SimpleTimedEvents' does not exist.

Timing is easy using a thread and time.sleep. The second example encapsulates all that is required into a class. The third shows how to make things interruptible.

timed_event.py

from time import sleep
from threading import Thread

def task():
  sleep(10)
  print("something")

Thread(target=task).start()
for i in range(20):
  print("Waiting",i)
  sleep(1)
print("done")  

timed_event2.py

from time import sleep
from threading import Thread
import time

class Timed:
  def __init__(self,target,delay,*args):
    self.thread = Thread(target=self.task)
    self.target = target
    self.args = args
    self.delay = float(delay)
  def task(self):
    time.sleep(self.delay)
    self.target(*self.args)
  def start(self):
    self.thread.start()
  def join(self):
    return self.thread.join()

def task():
  print("something")

Timed(task,5).start()
for i in range(10):
  print("Waiting",i)
  sleep(1)
print("done")

timed_event3.py

We test the shouldquit variable once per second. We allow for fractional delay time by decrementing the delay time by one second each time and having a special case to handle a fraction left over. That is, for a delay of 2.5 seconds, we sleep(1) twice so that the remaining time is 0.5 seconds, and then sleep(0.5) for the final bit of the delay.

from time import sleep
from threading import Thread
import time

class Timed:
  def __init__(self,target,delay,*args):
    self.thread = Thread(target=self.task)
    self.target = target
    self.args = args
    self.delay = float(delay)
    self.shouldquit = False
  def quit(self):
    self.shouldquit = True
    return self
  def task(self):
    while self.delay > 0:
      if self.shouldquit:
        print("Interrupted")
        return
      if self.delay < 1:
        time.sleep(self.delay)
        break
      else:
        self.delay -= 1
        time.sleep(1)
    self.target(*self.args)
  def start(self):
    self.thread.start()
    return self
  def join(self):
    return self.thread.join()

def task():
  print("something")
  victim.quit()

def task2():
  print("should not print")

Timed(task,2.5).start()
victim = Timed(task2,5).start()
for i in range(10):
  print("Waiting",i)
  sleep(1)
print("done")