Форум сайта python.su
Всем привет. Столкнулся с аномалией и никак не пойму в чем проблема. При нажатии кнопки 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)
Офлайн
Я заметил это происходит если объявить self.workerThread = Worker() в __init__ класса MyForm. Если объявить в OnClick, то все нормально, но мне такой вариант не подходит, нужно объявить этот поток на весь класс.
Офлайн
Поток перезапускать нельзя, необходимо всегда создавать новый.
Если требуется создать один поток на весь класс, используйте очередь(Queue) для передачи задач потоку.
Отредактировано (Март 7, 2012 07:02:03)
Офлайн