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