Уведомления

Группа в Telegram: @pythonsu

#1 Март 6, 2012 09:34:47

shs666
От:
Зарегистрирован: 2012-03-06
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4: QThread создает клоны

Всем привет. Столкнулся с аномалией и никак не пойму в чем проблема. При нажатии кнопки goButton запускается поток, который печатает числа от 1 до 10:
count = 1
count = 2

Когда задача завершается, если опять нажать на goButton, то стартует почему-то 2 одинаковых потока, которые печатают одновременно:
count = 1
count = 1
count = 2
count = 2


После каждого нажатия стартует на 1 поток больше. А нужно чтобы стартовало всего 1 единственный поток.

Прилагаю код, составленный для того чтобы показать как выглядит затея. Оригинал несколько больше :)

#worker.py
import time
from PyQt4 import QtCore


class Worker(QtCore.QThread):


def __init__(self):
QtCore.QThread.__init__(self)

def setVar(self, var):
self.variable = var

def run(self):
if self.variable == "print":
self.doPrint()

def doPrint(self):
count = 0
while True:
if count = 10:
break
count += 1
print("count = " + str(count))
time.sleep(1)


-------

#main.py
from worker import Worker
from PyQt4 import QtCore, QtGui
from Ui_form import Ui_MainForm


class MyForm(QtGui.QMainWindow):


def __init__(self):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_MainForm()
self.ui.setupUi(self)
self.workerThread = Worker()

self.ui.goButton.clicked.connect(self.goButton_OnClick)

def goButton_OnClick(self):
if self.workerThread.isRunning():
return
self.workerThread.setVar("print")
self.workerThread.start()

if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
mainform = MyForm()
mainform.show()
sys.exit(app.exec_())



Отредактировано (Март 7, 2012 05:29:40)

Офлайн

#2 Март 7, 2012 05:03:37

shs666
От:
Зарегистрирован: 2012-03-06
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4: QThread создает клоны

Я заметил это происходит если объявить self.workerThread = Worker() в __init__ класса MyForm. Если объявить в OnClick, то все нормально, но мне такой вариант не подходит, нужно объявить этот поток на весь класс.



Офлайн

#3 Март 7, 2012 06:59:17

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

PyQt4: QThread создает клоны

Поток перезапускать нельзя, необходимо всегда создавать новый.
Если требуется создать один поток на весь класс, используйте очередь(Queue) для передачи задач потоку.



Отредактировано (Март 7, 2012 07:02:03)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version