我有一个个人项目使用树莓派和两个电容话筒。我在每个麦克风上使用以下听众:
GPIO.add_event_detect(mic1, GPIO.BOTH, bouncetime=500)
GPIO.add_event_callback(mic1, soundHeard)
GPIO.add_event_detect(mic2, GPIO.BOTH, bouncetime=500)
GPIO.add_event_callback(mic2, soundHeard)
当检测到声音时(我在麦克风上使用数字触发器),事件会将pin号发送到回调。我使用pin号码来运行一个函数。当该函数正在运行时,大约10秒,我希望这两个事件完全停止触发,直到函数返回控制权。目前,侦听器不断地发送事件,这些事件似乎堆积在函数的上方,然后在函数完成后全部串行运行。在
我尝试过使用带有时间戳的全局变量和其他各种方法来停止事件侦听器,但没有成功。如果我试图关闭侦听器并重新打开它们,就会出现分段错误。如果你能帮上忙,我很感激
干杯
威特纳
从docs on SOURCEFORGE(就在这一部分的上方:Switch Debounce):
“注意,在这种情况下,回调函数是按顺序运行的,而不是同时运行的。这是因为只有一个线程用于回调,其中每个回调都按照定义的顺序运行。“
为了避免这种行为,我会将回调包装在一个函数中,该函数创建一个新线程来处理每个事件,从而让回调本身立即返回。然后我将使用^{} ,这样在第一个事件求值期间触发的任何事件都会立即抛出,而不是尝试解除绑定并重新绑定回调。在
**编辑以清晰明了
我使
^{pr2}$callback_dispatcher
函数比您的情况需要的复杂一点,以便使它更通用。更简单的版本可以直接用线程调用soundHeard
函数,而无需创建闭包(函数在函数中定义)。在相关问题 更多 >
编程相关推荐