如何在Python中停止一个Thread(我有一个无限循环)

时间:2013-08-01 16:17:53

标签: python multithreading kill

以下代码应该用于倒计时的计时器:

from org.csstudio.opibuilder.scriptUtil import PVUtil, ConsoleUtil, ColorFontUtil

from java.lang import Thread, Runnable

import threading

import time

startButton = display.getWidget("Start_Button")

stopButton = display.getWidget("Stop_Button")

resetButton = display.getWidget("Reset_Button")

bar = display.getWidget("Progress_Bar")

ECurrents = display.getWidget("Electron_Current")

PCurrents = display.getWidget("Positron_Current")

ELifetimes = display.getWidget("Electron Lifetimes")

PLifetimes = display.getWidget("Positron Lifetimes")

minText = display.getWidget("minText")

minPV=minText.getPV()

secText = display.getWidget("secText")

secPV=secText.getPV()

timerLabel = display.getWidget("timerLabel")

class Blink(Runnable):

    def run(self):

        i=0

        while PVUtil.getLong(pvs[2]) ==1:

            Thread.sleep(500)

            timerLabel.setPropertyValue("foreground_color", 

                        ColorFontUtil.YELLOW if i%2==0 else ColorFontUtil.RED)

            i=i+1

        timerLabel.setPropertyValue("foreground_color", ColorFontUtil.BLACK)

class Timer(Runnable):

    def run(self):        

        startButton.setEnabled(False)

        stopButton.setEnabled(True)

        resetButton.setEnabled(False)

        bar.setVisible(True)

        minText.setEnabled(False)

        secText.setEnabled(False)

        min = PVUtil.getLong(minPV)

        sec = PVUtil.getLong(secPV)

        #remember the values to be reset

        resetButton.setVar("min",120)

        resetButton.setVar("sec",0)

        timerLabel.setPropertyValue("foreground_color", ColorFontUtil.BLACK)

        timerLabel.setPropertyValue("text", "Time Left to Injection:")

        ECurrents.setPropertyValue("background_color", ColorFontUtil.GREEN)

        ELifetimes.setPropertyValue("background_color", ColorFontUtil.GREEN)

        PLifetimes.setPropertyValue("background_color", ColorFontUtil.GREEN)

        PCurrents.setPropertyValue("background_color", ColorFontUtil.GREEN)

        stopped=False

        total = (min*60)+(sec)

        for i in range(total,-1,-1):

            if not display.isActive():

                return

            if PVUtil.getLong(pvs[0])==0:

                stopped = True

                break            

            pvs[1].setValue(100-100*i/total)

            minPV.setValue(int(i/60))

            secPV.setValue(int(i%60))

            Thread.sleep(1000)            

        timerLabel.setPropertyValue("foreground_color", ColorFontUtil.RED)

        if (total==300):

            timerLabel.setPropertyValue("text", "5 minutes to injection!")

            PCurrents.setPropertyValue("background_color", ColorFontUtil.RED)

            ECurrents.setPropertyValue("background_color", ColorFontUtil.RED)

            ELifetimes.setPropertyValue("background_color", ColorFontUtil.RED)

            PLifetimes.setPropertyValue("background_color", ColorFontUtil.RED)

        if stopped:

            timerLabel.setPropertyValue("text", "Interrupted!")

        else:

            timerLabel.setPropertyValue("text", "Time's Up!!!")

            pvs[2].setValue(1)

            Thread(Blink()).start() 

        widget.executeAction(0)

        startButton.setEnabled(True)

        stopButton.setEnabled(False)

        resetButton.setEnabled(True)

        bar.setVisible(False)

        minText.setEnabled(True)

        secText.setEnabled(True)

if PVUtil.getLong(pvs[0])==1:

    thread =Thread(Timer());

    thread.start()

“widget.executeAction(0)”行应该是当计时器完成倒计时时播放的声音,但我遇到的问题是声音一直在无休止地播放。如何杀死线程以便它只执行一次?

1 个答案:

答案 0 :(得分:1)

“我遇到的问题是声音一直在无休止地播放”

这绝对是重复你的线程问题的调用。 (如果您提供调用上面发布的代码的代码,我相信我们可以帮助您找到它。)

Alternativly在你的代码中设置断点或消息框并告诉你(在线程开始之前和正在进行中)这样你就知道它被多次调用...以及何时。

希望这有帮助。

编辑:

if PVUtil.getLong(pvs[0])==1:

thread =Thread(Timer());

thread.start()

您正在线程中启动线程? - 从上面复制的代码中获取此表格