Связь между потоками в 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 emit() поскольку они являются общими данными (я пытался использовать PyObject в качестве типа данных, но double free() приведет к сбою программы), но я копирую данные с помощью deepcopy() (при условии, что данные могут быть скопированы следующим образом). Я использовал deepcopy (), потому что я предполагаю, что код вроде:

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

будет копировать только ссылку на данные (правильно?), и данные будут разделены и разблокированы после возврата … Правильно ли этот код? Что делать, если данные действительно большие (например, список из 1 000 000 единиц)?

Благодарю.

PS Я видел несколько примеров, таких как пример Qt Mandelbrot , или пример потоковой передачи с PyQt , но они используют QImage в качестве параметра в слотах.

  • Где pyside-uic?
  • setItemWidget вызывает сбои
  • Излучающий сигнал PySide вызывает сбой python
  • Начало работы с PySide
  • Требуется ли украшатель слотов PySide?
  • PySide: как я могу вызвать текущий нажатый QPushbutton, а не другой, добавленный позже
  • Pyside: addToJavaScriptWindowObject не работает должным образом, когда приложение скомпилировано с помощью cython
  • конвертировать список разделенных строк в дерево / вложенный dict, используя python
  • One Solution collect form web for “Связь между потоками в PySide”

    Я думаю, что это должно работать с PySide. если не работает, сообщите об ошибке на PySide bugzilla (http://bugs.openbossa.org/) с небольшим тестовым примером:

     class Thread(QThread): dataReady = Signal(object) def run(self): while True: self.data = slowly_produce_data() # this will add a ref to self.data and avoid the destruction self.dataReady.emit(self.data) class Widget(QWidget): def __init__(self): self.thread = Thread() self.thread.dataReady.connect(self.get_data, Qt.QueuedConnection) self.thread.start() def get_data(self, data): self.data = data def paintEvent(self, event): paint_somehow(self.data) 
    Python - лучший язык программирования в мире.