Я изучаю следующую проблему с потоками 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_()
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
и т. д. Некоторые очень грубые вопросы, хотя, я думаю, это сложная проблема: - Почему, хотя в официальной документации указано, что вызов QThread
exec_()
необходим, чтобы поток запускал обработку событий, похоже, это происходит без вызова определенных функций - В некоторых случаях прерывание потока ломается/обрабатывается threadFinished
, а в некоторых это не - самое главное: почему приложение не заканчивается? (Я также попытался app = QtCore.QCoreApplication(sys.argv)
)