使用qtimer和qthread的逻辑是否有缺陷?
我有一个用pyqt4开发的图形界面,里面有一个运行按钮。点击这个按钮后,我会启动一个定时器和一个线程。这个定时器会持续监控这个线程。在这个线程里,我会打开一个命令提示符来执行测试用例。我希望这个线程在命令提示符打开时保持活着,一旦我关闭命令提示符,就认为它已经结束。
为了实现这个功能,我写了下面的代码。请问有没有逻辑上的错误?或者有没有更好的方法来实现这个?
self.connect(self.run_button, SIGNAL('clicked()'), self.runscript)
def runscript(self):
self.timer = QTimer()
self.timer.connect(self.timer, SIGNAL("timeout()"),self.sendData)
self.timer.start(1000)
def sendData(self):
if self.run_timer:
run_monitor_object = RunMonitor()
print 'Starting the thread...........'
run_monitor_object.start()
self.run_timer = False
if run_monitor_object.isAlive():
print 'Thread Alive...'
else:
print 'Thread is Dead....'
class RunMonitor(threading.Thread):
def __init__(self, parent=None):
threading.Thread.__init__(self)
def run(self):
print 'Invoking Command Prompt..........'
subprocess.call(["start", "/DC:\\Scripts", "scripts_to_execute.bat"], shell=True)
当我运行这个代码时,我遇到了以下错误……
UnboundLocalError: 在 if run_monitor_object.isAlive(): 这一行中,局部变量 'run_monitor_object' 在赋值前被引用了。
我只是想知道还有什么其他的方法可以做到这一点。
1 个回答
0
这段代码:
if self.run_timer:
run_monitor_object = RunMonitor()
print 'Starting the thread...........'
run_monitor_object.start()
self.run_timer = False
if run_monitor_object.isAlive():
print 'Thread Alive...'
else:
print 'Thread is Dead....'
是错误的。如果第一次判断没有执行(比如在第二次调用时,self.run_timer
已经是True了),那么run_monitor_object
就没有被赋值,而你在第二个if
中尝试使用它,就会出问题。
要让这个代码正常工作,可以把run_monitor_thread
设为这个类的实例变量。
另外,为什么要在计时器里启动线程呢?这样只会让你的逻辑变得复杂。应该在创建计时器的时候就启动线程。然后用这个计时器来监控它。