Here is my desired functionality:
I want to listen over the local host for a variable, let’s say state 1 and state 2. I want my main script to execute function b, but if it receives a state 1 over the local host, I want it to interrupt whatever it’s doing (almost like a control-c), and start executing function A.
My issue is with the polling, I can’t seem to get the two to work independently of each other, it’s waiting for the execution of function b to finish before checking to see if the state over local host has changed.
Essentially I want the function to check weather the state has changed and whether it needs to switch what it executes in parallel.
Can anyone guide me in the right direction or point out my mistake?
Side note: I am simulating the change in state for now for simplicity’s sake.
import random
import threading
import time
state_lock = threading.Lock()
current_state = 1 # 1 for normal state, 2 for fall detected state
fall_detected = False
# Function for the normal task
def normal_task():
global current_state
task_duration = 20
elapsed = 0
while elapsed < task_duration:
with state_lock:
if current_state == 1:
print("Normal Task")
time.sleep(1)
elapsed += 1
else:
print("Fall detected")
break
def fall_task():
global current_state
while True:
with state_lock:
if current_state == 2:
print("Executing Fall Detected")
time.sleep(2)
current_state = 1
print("Fall handled")
break
time.sleep(0.5)
# Function to simulate fall detection signal and switch states
def fall_detection_signal():
global current_state, fall_detected
previous_time = time.time()
while True:
current_time = time.time()
elapsed_time = (
current_time - previous_time
)
previous_time = current_time
print(f"Time since last fall detection check: {elapsed_time:.2f} seconds")
time.sleep(
random.uniform(5, 10)
) # Simulate random time for fall detection check
with state_lock:
fall_detected = True
current_state = 2
print("Fall Detected! Switching state to Fall Detected.")
time.sleep(5)
fall_detected = False
normal_task_thread = threading.Thread(target=normal_task)
fall_detection_thread = threading.Thread(target=fall_detection_signal)
normal_task_thread.start()
fall_detection_thread.start()
while True:
if fall_detected:
fall_task_thread = threading.Thread(target=fall_task)
fall_task_thread.start()
fall_task_thread.join()
if current_state == 1:
normal_task_thread = threading.Thread(target=normal_task)
normal_task_thread.start()
normal_task_thread.join()
2