Есть ли недостатки в логике использования qtimer и qthread? - PullRequest
0 голосов
/ 11 мая 2011

У меня есть графический интерфейс, разработанный с использованием 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: локальная переменная 'run_monitor_object', на которую ссылается перед присваиванием if run_monitor_object.isAlive ():

Просто интересно, как еще, я мог бы

1 Ответ

0 голосов
/ 11 мая 2011

Этот код:

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 уже истина), run_monitor_object не назначается, и вы пытаетесь использовать ее во второй if.

Чтобы сделать это, сделайте run_monitor_thread переменной экземпляра класса.

Кроме того, зачем запускать поток в таймере? Это просто излишне усложняет вашу логику. Запустите его, когда вы создадите таймер. Затем таймер будет использоваться для его мониторинга.

...