警报代码有问题,需要用户输入和后台计时器。定时器工作,但不停止程序
Posted
技术标签:
【中文标题】警报代码有问题,需要用户输入和后台计时器。定时器工作,但不停止程序【英文标题】:Problem with alarm code, need user input and timer in background. Timer works, but doesn't stop program 【发布时间】:2019-11-08 19:59:24 【问题描述】:我正在为一个警报系统编写代码,该系统运行预定的时间,并允许用户输入代码多达 3 次。如果代码在 3 次内没有正确输入,我有一个按定义工作的打印语句(最终将附加更多代码),问题是我需要超时来类似地执行一些代码。如,如果超时,那么也这样做,(基本上转到输入失败所在的同一行代码)
TIMEOUT = 7 # number of seconds your want for timeout
keycode ="0000";
count = 3
def interrupted(signum, frame):
"called when read times out"
print ('Input timeout!! Contacting Owner!')
signal.signal(signal.SIGALRM, interrupted)
def input():
try:
count = 3
for i in range(3,0,-1):
userIn= raw_input("Enter the security code to disable the alarm
system\n");
if userIn != keycode :
count = count-1;
print ("Incorrect Password...Tries Remaining", count);
else:
print("Password accepted, security system offline");
#BRANCHING CODE GOES HERE
break
if count == 0:
print("Contacting Owner!");
#BRANCHING CODE GOES HERE
except:
return
# set alarm
signal.alarm(TIMEOUT)
s = input()
# disable the alarm after success
signal.alarm(0)
超时后,消息打印输入超时!!联系所有者!,但用户仍然可以输入密码。这显然不是一个很好的报警系统!理想情况下,我可以在“if count == 0 or TIMEOUT: True”之类的东西上创建一个 or 语句。
【问题讨论】:
【参考方案1】:由于某种原因,将这一点代码添加到定义部分解决了问题
我不知道为什么,也不知道怎么做,但是去掉 return0 上的 0 或将其移开一个空格会破坏代码功能。如果有人能解释为什么那会很棒。
a = 1 ;
def interrupted(signum, frame):
a = 0;
"called when read times out"
print ('Input timeout!! Contacting Owner!');
if a == 0:
return0
signal.signal(signal.SIGALRM, interrupted)
【讨论】:
以上是关于警报代码有问题,需要用户输入和后台计时器。定时器工作,但不停止程序的主要内容,如果未能解决你的问题,请参考以下文章
C# - 在需要时从多个运行的计时器中处理一个特定的计时器[关闭]