我现在要毁了四个小时才找到解决办法;(。
我在树莓派上运行一个python脚本,该脚本驱动了一些Neopixels。动画是由网络套接字消息定义的。
在每条消息上,我都会调用一个函数来播放动画,动画结束后,我会向后端提出新请求以检索新消息。这很好。
现在,我想在动画完成之前就将新动画发送到raspi(由智能手机触发)。动画会阻止主线程,因此websocket消息只有在动画完成后才能到达。
--->这就是为什么我在新线程中运行动画功能。这样,当动画功能仍在运行时,已经收到了websocket消息。 新消息创建一个新线程。
问题来了:让我们想象第一个动画需要10秒钟才能完成,而5秒钟之后,新消息已经创建了新线程。这样,我们有两个线程同时在相同的Neopixels上播放动画。就像一场小小的战斗。
最好的解决方案是停止第一个动画的线程。因为没有用于杀死线程的函数,所以我想在动画函数中检查变量,因为return语句结束了函数并“破坏”了线程,所以返回return。
这是我的代码:
def set_frame(strip, array, brightness, frameCount, delay, firstThread):
ArrayIndex = 0
for f in range(frameCount):
for i in range(strip.numPixels()):
strip.setPixelColor(i, array[ArrayIndex])
ArrayIndex += 1
strip.setBrightness(brightness)
strip.show()
// thats what i thought
if thisIsTheOldThread:
return
// but how do I know if there is already a new Thread?
time.sleep(delay)
def on_message(ws, message):
jsonMessage = json.loads(message)
setFrameThread = threading.Thread(target=set_frame, args=(strip, jsonMessage["frame"], jsonMessage["brightness"], jsonMessage["frames"], jsonMessage["delay"]))
setFrameThread.daemon = True
setFrameThread.start()
如果您有其他想法,我很想听听。感谢您的帮助。