RPi.GPIO 中断然后让调用者立即返回?

问题描述

所以现在我有两个功能

Def dostuff():
  # do stuff 1
  GPIO.add_event_detect(button,…,callback=Interrupt,…)
  # do stuff 2

Def Interrupt():
  # other stuff

当我运行 dostuff() 时,它执行第 1 项操作,注册中断,然后执行第 2 项操作。当我在执行操作 2 期间按下按钮时,中断被调用,然后返回到 dostuff() 中断处.

我的问题是当我从中断返回时,我希望它在 dostuff() 中调用 return True 从而提前离开函数调用。基本上充当 do stuff 2 的中止开关,因为它需要很长时间。

我尝试在中断中引发异常并在 dostuff() 中放置一个 try catch,但显然引发异常不会返回给调用者。

添加全局变量并不是一个真正的选择,除非我想在 dostuff() 的每一行之后做一个检查。

让中断调用代码的不同部分来改变执行是可行的,但如果我优雅地结束,它最终会返回到令人讨厌和不干净的中断调用者。

有什么想法吗?

解决方法

实现此目的的一种方法是将 do stuff 2 变成单独的进程并终止 Interrupt 中的进程:

>>> process = subprocess.Popen("sleep 3 && echo end",shell=True)
>>> end
process = subprocess.Popen("sleep 3 && echo end",shell=True)
>>> process.kill()
>>> # No end here

您应该在通过以下方式创建流程时准备回调:

def createKiller(process):
    return lambda: process.kill()

并给出回调,如:

process = subprocess.Popen(["python","do_stuff_2.py"] + your_args,stdout=subprocess.PIPE)
GPIO.add_event_detect(button,…,callback=createKiller(process),…)

然后您等待结果为:

>>> while process.poll() is None:
...   time.sleep(1)
...   print('waiting...')
... 
waiting...
waiting...
waiting...
>>> process.communicate()
(b'end\n',None)