如何停止Python中的线程(我有一个无止境的循环)

2024-10-01 00:30:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)“line应该是计时器倒数计时结束时播放的声音,但我遇到的问题是声音一直在播放。我如何杀死线程,使它只做一次?在


Tags: falsetrueifdisplayredthreadcolorbackground
1条回答
网友
1楼 · 发布于 2024-10-01 00:30:09

“我遇到的问题是声音不断播放”

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

交替地在你的代码中设置断点或消息框,并让它告诉你(在线程启动之前和进程中),这样你就可以知道它被多次调用了。。。什么时候。在

希望这有帮助。在

编辑:

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

thread =Thread(Timer());

thread.start()

你正在启动你的线程中的线程?-收到这张表格了吗

相关问题 更多 >