Найти - Пользователи
Полная версия: PyQt4: QThread создает клоны
Начало » GUI » PyQt4: QThread создает клоны
1
shs666
Всем привет. Столкнулся с аномалией и никак не пойму в чем проблема. При нажатии кнопки 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_())
shs666
Я заметил это происходит если объявить self.workerThread = Worker() в __init__ класса MyForm. Если объявить в OnClick, то все нормально, но мне такой вариант не подходит, нужно объявить этот поток на весь класс.
truporez
Поток перезапускать нельзя, необходимо всегда создавать новый.
Если требуется создать один поток на весь класс, используйте очередь(Queue) для передачи задач потоку.
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