Russian Qt Forum
Май 03, 2024, 02:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Простой пример работы с QThread  (Прочитано 9679 раз)
paul_winex
Гость
« : Сентябрь 11, 2013, 13:28 »

Есть простой пример использования QThread. Простой окно с кнопкой запуска процесса. Каждая итерация процесса изменяет текст на кнопке. При этом само окно не виснет и доступно.

Код
Python
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import time
 
 
class Worker(QObject):
   finished = pyqtSignal()
   message = pyqtSignal(int)
 
   @pyqtSlot()
   def process(self):
       print 'START'
       for i in range(10):
           print 'sleep', i
           self.message.emit(i)
           time.sleep(0.5)
       print 'FINISHED'
       self.finished.emit()
 
 
class MyWidget(QWidget):
   def __init__(self, *args, **kwargs):
       super(MyWidget, self).__init__(*args, **kwargs)
       self.button = QPushButton("Start process", self)
       self.button.clicked.connect(self.start)
       layout = QVBoxLayout(self)
       layout.addWidget(self.button)
       self.resize(250, 150)
 
   def start(self):
       thread = QThread(self)
       worker = Worker()
       worker.moveToThread(thread)
 
       # thread.started.connect(worker.process)
       self.connect(thread, SIGNAL('started()'), worker, SLOT('process()'))
       worker.finished.connect(thread.quit)
       worker.message.connect(self.text)
 
       thread.start()
 
   def text(self, i):
       self.button.setText('Process '+str(i))
 
app = QApplication([])
widget = MyWidget()
widget.show()
app.exec_()

Никаких ошибок нет, но не срабатывает запуск процесса worker.process, на который законекчен сигнал started() самого потока. То есть вся работа должна начаться, когда Thread запущен, но ничего не происходит. Возможно я где-то что-то не до конектил?
Спасибо.
« Последнее редактирование: Сентябрь 11, 2013, 14:30 от paul_winex » Записан
paul_winex
Гость
« Ответ #1 : Сентябрь 11, 2013, 15:08 »

Что ж, истина была рядом. нужно было объекты thread и  worker делать объектами класса через self

Код
Python
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import time
 
 
class Worker(QObject):
   finished = pyqtSignal()
   message = pyqtSignal(int)
 
   @pyqtSlot()
   def process(self):
       print 'START'
       for i in range(10):
           print 'sleep', i
           self.message.emit(i)
           time.sleep(0.5)
       print 'FINISHED'
       self.finished.emit()
 
class MyWidget(QWidget):
   def __init__(self, *args, **kwargs):
       super(MyWidget, self).__init__(*args, **kwargs)
       self.start_btn = QPushButton("Start process", self)
       self.start_btn.clicked.connect(self.start)
 
       layout = QVBoxLayout(self)
       layout.addWidget(self.start_btn)
       self.resize(250, 150)
 
   def start(self):
       self.thread = QThread(self)
       self.worker = Worker()
       self.worker.moveToThread(self.thread)
 
       self.thread.started.connect(self.worker.process)
       self.worker.finished.connect(self.thread.quit)
       self.worker.finished.connect(self.worker.deleteLater)
       self.thread.finished.connect(self.thread.deleteLater)
       self.worker.message.connect(self.text)
       self.thread.start()
 
 
   def text(self, i):
       self.start_btn.setText('Process '+str(i))
 
app = QApplication([])
widget = MyWidget()
widget.show()
app.exec_()

Остается вопрос как корректно завершить процесс в любой момент до его окончания, но это наверное другая тема.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.073 секунд. Запросов: 20.