我正在用我的Raspberry Pi和Twinkle构建电话。 在我的示例中,我从子流程开始Twinkle,然后检查代码的输出。
现在,当有人打电话来检查“结束通话按钮”时,我需要开始一个while循环。这很好,但是如果远端取消了呼叫,我需要结束循环。如果有条件,我该如何中断while循环?
例如,这是我的代码:
#IMPORTS
import sys
import time
import RPi.GPIO as GPIO
from multiprocessing.pool import ThreadPool
import threading
#START TWINKLE
from subprocess import Popen, PIPE
proc = Popen(["twinkle", "-c"], stdin=PIPE, stdout=PIPE, bufsize=1)
for line in iter(proc.stdout.readline, b''):
print line
#BUTTON WATCHER
def button_watch():
input_state = GPIO.input(36)
while (input_state == False):
print "loop"
#END LOOP ON BUTTON PRESS
if (input_state == False):
print('Button Pressed')
input_state = GPIO.input(36)
GPIO.setup(32, GPIO.OUT)
GPIO.output(32, GPIO.LOW)
proc.stdin.write("answer\n")
time.sleep(0.2)
break
#INCOMING CALL
def main():
if (line.find("incoming call") > 0):
print "call is coming"
GPIO.setmode(GPIO.BOARD)
GPIO.setup(32, GPIO.OUT)
GPIO.output(32, GPIO.HIGH)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(36, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#START BUTTON WATCHER ON INCOMING CALL
t1 = threading.Thread(target=button_watch)
t1.start()
#CALL CANCELLED
if (line.find("far end cancelled call") > 0):
print "call was cancelled"
GPIO.setmode(GPIO.BOARD)
GPIO.setup(32, GPIO.OUT)
GPIO.output(32, GPIO.LOW)
##############################################
# NEED TO END WHILE LOOP FROM "button_watch" #
##############################################
tmain = threading.Thread(target=main)
tmain.start()
proc.communicate()
答案 0 :(得分:1)
我添加了一条寻求澄清的评论,因为我不确定我是否完全理解其意图。现在,最终您将找到更好和更强大的方法来执行此操作,但是最简单的解决方案是检查复合条件(假设您仍然需要input_condition == False
)。
因此,您可以定义一个名为remote_disconnected
的全局标志,以在while循环开始时运行的方式对其进行初始化,并将其组合为:
while (input_condition == False and remote_disconnected == False):
答案 1 :(得分:0)
使button_watch依赖于全局标志,因此您可以将标志设置为False