Пример правильного использования QThread в PyQt?

Использовать обертку

С Java 8 +:

AtomicInteger ordinal = new AtomicInteger(0);
list.forEach(s -> {
  s.setOrdinal(ordinal.getAndIncrement());
});

С Java 10 +:

var wrapper = new Object(){ int ordinal = 0; };
list.forEach(s -> {
  s.setOrdinal(wrapper.ordinal++);
});
30
задан Azendale 2 June 2013 в 05:09
поделиться

1 ответ

Вы правы, что хорошо, когда рабочий поток выполняет обработку, в то время как основной поток выполняет GUI. Кроме того, PyQt предоставляет инструментарий потока с механизмом сигнала / слота, который является потокобезопасным.

Это может звучать интересно . В их примере они строят графический интерфейс

import sys, time
from PyQt4 import QtCore, QtGui

class MyApp(QtGui.QWidget):
 def __init__(self, parent=None):
  QtGui.QWidget.__init__(self, parent)

  self.setGeometry(300, 300, 280, 600)
  self.setWindowTitle('threads')

  self.layout = QtGui.QVBoxLayout(self)

  self.testButton = QtGui.QPushButton("test")
  self.connect(self.testButton, QtCore.SIGNAL("released()"), self.test)
  self.listwidget = QtGui.QListWidget(self)

  self.layout.addWidget(self.testButton)
  self.layout.addWidget(self.listwidget)

 def add(self, text):
  """ Add item to list widget """
  print "Add: " + text
  self.listwidget.addItem(text)
  self.listwidget.sortItems()

 def addBatch(self,text="test",iters=6,delay=0.3):
  """ Add several items to list widget """
  for i in range(iters):
   time.sleep(delay) # artificial time delay
   self.add(text+" "+str(i))

 def test(self):
  self.listwidget.clear()
  # adding entries just from main application: locks ui
  self.addBatch("_non_thread",iters=6,delay=0.3)

(простой пользовательский интерфейс, содержащий виджет списка, к которому мы добавим некоторые элементы, нажав кнопку)

Затем вы можете создать наш собственный класс потока Например,

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

 def __del__(self):
  self.wait()

 def run(self):
  for i in range(6):
   time.sleep(0.3) # artificial time delay
   self.emit( QtCore.SIGNAL('update(QString)'), "from work thread " + str(i) )

  self.terminate()

Вы переопределяете метод run(). Вы можете найти альтернативу terminate(), см. Учебник.

0
ответ дан lgwilliams 2 June 2013 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: