创建新线程时停止旧线程

时间:2019-11-18 21:20:22

标签: python python-3.x multithreading animation raspberry-pi

我现在要毁了四个小时才找到解决办法;(。

我在树莓派上运行一个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()

如果您有其他想法,我很想听听。感谢您的帮助。

0 个答案:

没有答案