Say if I have four functions as below:
def foo():
subprocess.Popen('start /B someprogramA.exe', shell=True)
def bar():
subprocess.Popen('start /B someprogramB.exe', shell=True)
def foo_kill():
subprocess.Popen('taskkill /IM someprogramA.exe')
def bar_kill():
subprocess.Popen('taskkill /IM someprogramB.exe')
How can I alternate foo and bar functions to run every, say 30 minutes?
Meaning: 1st 30mins - run foo
, 2nd 30mins - run bar
, 3rd 30mins - run foo
, and so on. Each new run should 'kill' the previous thread/func.
I have a countdown timer threads, but not sure how to 'alternate' the functions.
class Timer(threading.Thread):
def __init__(self, minutes):
self.runTime = minutes
threading.Thread.__init__(self)
class CountDownTimer(Timer):
def run(self):
counter = self.runTime
for sec in range(self.runTime):
#do something
time.sleep(60) #editted from 1800 to 60 - sleeps for a minute
counter -= 1
timeout=30
c=CountDownTimer(timeout)
c.start()
EDIT: My solution with Nicholas Knight's inputs...
import threading
import subprocess
import time
timeout=2 #alternate delay gap in minutes
def foo():
subprocess.Popen('start /B notepad.exe', shell=True)
def bar():
subprocess.Popen('start /B calc.exe', shell=True)
def foo_kill():
subprocess.Popen('taskkill /IM notepad.exe')
def bar_kill():
subprocess.Popen('taskkill /IM calc.exe')
class Alternator(threading.Thread):
def __init__(self, timeout):
self.delay_mins = timeout
self.functions = [(foo, foo_kill), (bar, bar_kill)]
threading.Thread.__init__(self)
def run(self):
while True:
for f, kf in self.functions:
f()
time.sleep(self.delay_mins*60)
kf()
a=Alternator(timeout)
a.start()
Works fine.
Remember that functions are first-class objects in Python. That means you can store them in variables and containers! One way to do it would be:
funcs = [(foo, foo_kill), (bar, bar_kill)]
def run(self):
counter = self.runTime
for sec in range(self.runTime):
runner, killer = funcs[counter % 2] # the index alternates between 0 and 1
runner() # do something
time.sleep(1800)
killer() # kill something
counter -= 1
You're overcomplicating this.
while True:
foo()
time.sleep(1800)
foo_kill()
bar()
time.sleep(1800)
bar_kill()
Or if you want to easily add more functions later:
functions = [(foo, foo_kill), (bar, bar_kill), ] # Just append more as needed
while True:
for f, kf in functions:
f()
time.sleep(1800)
kf()
Use a variable to record which function you ran last time. When the timer fires, run the other function and update the variable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With