Найти - Пользователи
Полная версия: QThread и зависание окна
Начало » GUI » QThread и зависание окна
1
reychal
Есть mainwindow с ProgressBar. В QThread выполняется цикл, значение посылается через Event в ПрогрессБар. Первые несколько секунд бар обновляется, а затем окно подвисает. Цикл в потоке отрабатывается и значение отправляет, но из-за зависания прогресс бар обновляется в самом начале на пару значений и уже когда цикл отработает. В цикле потока пробовала вставлять self.app.processEvents(). Подскажите, как избавится от зтого зависания?
Python 3, Win7

class Thread(QtCore.QThread):
def __init__(self, parent, typewin = '', progress = '', sait_id = '', app = None):
QtCore.QThread.__init__(self, parent)
print('5 этап')
self.app = app
self.parent = parent
self.progress = progress
self.cout = 10000

def run(self):
c = 0
while c < self.cout:
print('этап', c)
data = c + (self.cout - c) / 100
self.app.postEvent(self, MyEvent(data, self.progress, self.app))
self.app.processEvents()
c+=1

class MyEvent(QtCore.QEvent):
def __init__(self, data, progressbar, app):
QtCore.QEvent.__init__(self, QtCore.QEvent.User)
self.data = data
progressbar.setValue(self.data)
progressbar.update()
#app.processEvents()
print(self.data)
Psixo
Для прогресс-бара я использовал несколько иной вариант, обновлял значение не через Event,а через сигнал. В потоке прописывал сигнал,в классе окна слот,типо такого:

# В потоке
self.emit(QtCore.SIGNAL("SetProgress(int)"), progress)

# В "окне"
self.connect(self.thread, QtCore.SIGNAL("SetProgress(int)"), self.SetProgress)

def SetProgress(self, value):
self.ui.ProgressBar.setValue(value)
Возможно такой подход кривой (все же PyQT использую мало времени), но с корректностью проблем не возникало.
SkyRzn
Честно говоря, я не понял всех этих извращений с событиями.
Соглашусь с Psixo, такие вещи делаются на сигналах/слотах. Только я бы подключил сигнал к слоту так, чтобы он явно был поставлен в очередь событий:
self.connect(self.thread, QtCore.SIGNAL("SetProgress(int)"), self.SetProgress, Qt.QueuedConnection)
Здесь я, может быть, перестраховываюсь - по-дефолту сигнал из другого потока и так встанет в очередь, но явно прописанное свойство читается в коде более очевидно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB