Я пытаюсь создать простое приложение с резьбой, в котором у меня есть метод, который выполняет некоторую длинную обработку и виджет, отображающий панель загрузки и кнопку отмены.pyqt QThread blocking main thread
Моя проблема заключается в том, что независимо от того, как я реализую потоки, на самом деле это не поток - пользовательский интерфейс блокируется после того, как поток начинает работать. Я прочитал каждый учебник и разместил об этом, и теперь я прибегаю к попросив сообщество попытаться решить мою проблему, поскольку я в недоумении!
Первоначально я пробовал подклассифицировать QThread, пока интернет не сказал, что это неправильно. Затем я попытался использовать метод moveToThread, но он сделал нулевую разницу.
Initialization Код:
loadingThreadObject = LoadThread(arg1)
loadingThread = PythonThread()
loadingThreadObject.moveToThread(loadingThread)
loadingThread.started.connect(loadingThreadObject.load)
loadingThread.start()
PythonThread класс (по-видимому объектов QThread прослушиваются в PyQt и не начинайте, если вы этого не сделаете):
class PythonThread (QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
def start(self):
QtCore.QThread.start(self)
def run(self):
QtCore.QThread.run(self)
LoadThread класс:
class LoadThread (QtCore.QObject):
results = QtCore.Signal(tuple)
def __init__ (self, arg):
# Init QObject
super(QtCore.QObject, self).__init__()
# Store the argument
self.arg = arg
def load (self):
#
# Some heavy lifting is done
#
loaded = True
errors = []
# Emits the results
self.results.emit((loaded, errors))
Любая помощь очень ценится!
Спасибо. Бен.
Что такое именно «тяжелый подъем»? Ответ на этот вопрос может повлиять на то, будет ли нарезка ничем не отличаться (из-за ограничений, налагаемых GIL Python). – ekhumoro
В основном это относится к SQL-запросам. Я не так заинтересован в производительности, как отзывчивый интерфейс. – Ben
Я не говорил о производительности. Если GIL не будет выпущен во время долговременной задачи, тогда, _in себя_, потоки не будут препятствовать блокировке. Вам нужно разбить задачу на куски и периодически отправлять сигнал в основной поток графического интерфейса, чтобы он мог обрабатывать любые ожидающие события (т. Е. Вызывать 'qApp.processEvents() 'или что-то еще). – ekhumoro