使用qtimer和qthread的逻辑是否有缺陷?

0 投票
1 回答
607 浏览
提问于 2025-04-16 17:25

我有一个用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设为这个类的实例变量。

另外,为什么要在计时器里启动线程呢?这样只会让你的逻辑变得复杂。应该在创建计时器的时候就启动线程。然后用这个计时器来监控它。

撰写回答