警报代码有问题,需要用户输入和后台计时器。定时器工作,但不停止程序

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# - 在需要时从多个运行的计时器中处理一个特定的计时器[关闭]

如何使用 iPhone SDK 4.0 实现警报

如何创建在使用 AnimationController 创建的倒数计时器期间发出的警报?

在后台运行ios应用