以下代码应该用于倒计时的计时器:
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)”行应该是当计时器完成倒计时时播放的声音,但我遇到的问题是声音一直在无休止地播放。如何杀死线程以便它只执行一次?
答案 0 :(得分:1)
“我遇到的问题是声音一直在无休止地播放”
这绝对是重复你的线程问题的调用。 (如果您提供调用上面发布的代码的代码,我相信我们可以帮助您找到它。)
Alternativly在你的代码中设置断点或消息框并告诉你(在线程开始之前和正在进行中)这样你就知道它被多次调用...以及何时。
希望这有帮助。
编辑:
if PVUtil.getLong(pvs[0])==1:
thread =Thread(Timer());
thread.start()
您正在线程中启动线程? - 从上面复制的代码中获取此表格