Python Forum

Full Version: how to cancel scheduler module event
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi,

I am stuck trying to figure out how to cancel an event that was created using the scheduler module. Here are the scheduler docs:
https://docs.python.org/3/library/sched.html

I am not sure how to reference the event?

My code below is 100% working, you can try it out. Press "S" to start the program and "Q" to quit the program. I have not found the right code to put into the cancel() function. I am using the scheduler for a 10 second delay, so if I press start and then press quit immediately after, the program does not exit until the full 10 seconds have passed.

Any help is appreciated!!

import time
import sched
import threading
import keyboard

s = sched.scheduler(time.time, time.sleep)


class Task:
    def __init__(self):
        self._running = False
        self.firstTime = True

    def terminate(self):
        self._running = False
        #s.cancel(?????????)
        # attempting to cancel all scheduled events here
        # how to reference my delayCancellable event??

    def pass_func(self):
        pass

    def delayCancellable(self, set_time):
        s.enterabs((time.time()+set_time), 1, self.pass_func)
        s.run()

    def run(self):
        if self._running:
            print("Start Time: ", time.time())
            self.delayCancellable(10)
        if self._running:
            print("After 10sec: ", time.time())


c = Task()
t = threading.Thread(target=c.run)


def startCallback():
    print("program started")
    c._running = True
    t.start()


def cancelCallback():
    print("program ended")
    c.terminate()
    c.firstTime = False

keyboard.add_hotkey('s', callback=startCallback)   # keyboard "S" used to start program
keyboard.add_hotkey('q', callback=cancelCallback)  # keyboard "Q" used to cancel program

c.firstTime = True
while True:
    if not c.firstTime:
        break

I rewrote a few things I think the program is a little easier to understand now. Also I attempted to use this example from stackexchange

But it still does not work. If you press S and then press Q within a few seconds it still takes the full 10 seconds before the program is cancelled.



import time
import sched
import threading
import keyboard


class Task:
    def __init__(self):
        self.schedule = sched.scheduler(time.time, time.sleep)
        self._running = False
        self.firstTime = True

    def stop(self):
        self._running = False
        self.schedule.cancel(self.event)
        # attempting to cancel all scheduled events here
        # how to reference my delayCancellable event??

    def pass_func(self):
        pass

    def delayCancellable(self, set_time):
        self.event = self.schedule.enterabs((time.time()+set_time), 1, self.pass_func)
        self.schedule.run()


    def start(self):
        if self._running:
            print("Start Time: ", time.time())
            self.delayCancellable(10)
        if self._running:
            print("After 10sec: ", time.time())


task = Task()
thread = threading.Thread(target=task.start)


def startCallback():
    print("program started")
    task._running = True
    thread.start()


def cancelCallback():
    print("program ended")
    task.firstTime = False
    task.stop()
    

keyboard.add_hotkey('s', callback=startCallback)   # keyboard "S" used to start program
keyboard.add_hotkey('q', callback=cancelCallback)  # keyboard "Q" used to cancel program

task.firstTime = True
while True:
    if not task.firstTime:
        break