Коммуникация между потоками в PySide

У меня есть поток, который производит некоторые данные (список Python) и который должен быть доступен для виджета, который считает и отобразит данные в основном потоке. На самом деле я использую QMutex для обеспечения доступа к данным, таким образом:

class Thread(QThread):
  def get_data(self):
    QMutexLock(self.mutex)
    return deepcopy(self.data)

  def set_data(self, data):
    QMutexLock(self.mutex)
    self.data = deepcopy(data)

  def run(self):
    self.mutex = QMutex()
    while True:
      self.data = slowly_produce_data()
      self.emit(SIGNAL("dataReady()"))

class Widget(QWidget):
  def __init__(self):
    self.thread = Thread()
    self.connect(self.thread, SIGNAL("dataReady()"), self.get_data)
    self.thread.start()

  def get_data(self):
    self.data = self.thread.get_data()

  def paintEvent(self, event):
    paint_somehow(self.data)

Обратите внимание, что я не передаю данные в emit() поскольку они - универсальные данные (я пытался использовать PyObject в качестве типа данных, но двойное free() разрушил бы программу), но я копирую данные с a deepcopy() (принятие данных может быть скопировано как это). Я использовал deepcopy (), потому что я предполагаю что код как:

def get_data(self):
  QMutexLock(self.mutex)
  return self.data

только скопировал бы ссылку на данные (право?) и данные были бы совместно использованы И разблокированы после возврата... Этот код является правильным? Что я могу сделать, если данные являются действительно большими (как список 1'000'000 объектов)?

Спасибо.

P.S. Я видел некоторые примеры, как QT пример Mandelbrot или пример поточной обработки с PyQt, но они используют QImage в качестве параметра в слотах.

15
задан ekhumoro 14 December 2017 в 19:42
поделиться