2013-09-10 3 views
1

Я изучаю следующую проблему с потоками PySide, но я нашел очень мало документации, поэтому здесь вышла длинная публикация о моих выводах, надеясь получить краткий отзыв о том, как это происходит. Предположим, что мы создаем многопотоковое графическое приложение, которое вызывает некоторые процессы Linux. Мы будем использовать класс QThread для вызова QProcess изнутри с целью одновременного использования приложения с несколькими процессами (в разных потоках)PySide: Обработка событий QThread

Я использую только класс QThread и начинаю с основного QApplication петля

Случай 1: - Подключаем сигнал завершения нити к другой функции того же класса, что вызывает self.exit (так, что выходит из класса резьбы) - Нет вызова на self.exec_() в соответствии с инструкциями в официальной документации PySide http://tinyurl.com/qh7cooa

#!/usr/bin/python3.2 
from PySide import QtGui 
from PySide import QtCore 
import sys, random 

class ProcThread(QtCore.QThread): 

    def __init__(self, parent=None): 
     super(ProcThread, self).__init__(parent) 

    def run(self): 
     try: 
      self.qproc = QtCore.QProcess() 
      self.finished.connect(self.threadFinished) 
      filename = "/home/user1/Desktop/fileno"+str(random.randint(1, 10000))+".txt" 
      self.qproc.start("touch", [filename])  
     except Exception as error: 
      print(str(error)) 
      raise(error) 

    #self.exec_() 

    def threadFinished(self): 
     print("Thread has finished") 
     self.qproc.close() 

app = QtGui.QApplication(sys.argv) 
procthread = ProcThread() 
procthread.start() 
app.exec_() 

РЕЗУЛЬТАТ: Прекращение нить захватывается (сообщение «Тема завершена» печатается), процесс мчит (создается файл), но приложение не ВЫХОДА

Case 2: Same как и раньше, но теперь также вызывает self._exec() (раскомментирование соответствующей строки в предыдущем фрагменте кода) РЕЗУЛЬТАТ: Прекращение потока не выполняется, процесс запускается (файл создается), и еще раз приложение НЕ ВЫХОДА (остается как фоновое задание) после Ctrl + Z/должно его явно убить

Корпус 3: Теперь соединение сигнала, переданного, когда QProcess заканчивается через self.qproc.finished.connect(self.threadFinished). No call to self.exec_()

10 только указанный код между try-except - #self.exec_() остается комментировал
self.qproc = QtCore.QProcess() 
self.qproc.finished.connect(self.threadFinished) 
filename = "/home/pantelis/Desktop/fileno" + str(random.randint(1, 10000)) + ".txt" 
self.qproc.start("touch", [filename]) 

РЕЗУЛЬТАТ: Как и в случае 2 - Прекращение нить не ловится, процесс мчит (создается файл) и еще раз приложение НЕ ВЫЙТИ

Case 4: Как и в случае 1, но теперь, добавив следующую строку в threadFinished self.exit() РЕЗУЛЬТАТ: Как и в случае 2 - прекращение нить не ловится, процесс мчит (создается файл) и еще раз приложение дЕЛАЕТ NOT EXIT

Случай 5: Как и в случае 4, просто раскомментировать self.exec_() РЕЗУЛЬТАТЫ: прекращение Thread поймана (сообщение «Тема завершена» печатается), создается файл и еще раз приложение НЕ ВЫЙТИ

случаи 6, 7, 8: Добавлен self.qproc.close()/self.qproc.terminate()/self.qproc.kill() в threadFinished явно прекратить QProcess от конкретной функции РЕЗУЛЬТАТ: Как и в случае 5

Можно было ALS o попробуйте различные альтернативы, например, связывание сигнала self.terminated от QThread до threadFinished и т. д. Некоторые очень грубые вопросы, хотя, я думаю, это сложная проблема: - Почему, хотя в официальной документации указано, что вызов QThreadexec_() необходим, чтобы поток запускал обработку событий, похоже, это происходит без вызова определенных функций - В некоторых случаях прерывание потока ломается/обрабатывается threadFinished, а в некоторых это не - самое главное: почему приложение не заканчивается? (Я также попытался app = QtCore.QCoreApplication(sys.argv))

ответ

1

Просто позвоните app.quit() в вашем threadFinished обработчика, и если у вас есть видимые виджеты, hide() и destroy() главное окно, это должно заботиться об уничтожении всех детей.

Смежные вопросы