Связь между потоками в 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 в качестве параметра в слотах.

  • Загрузка общей таблицы Google в Pandas
  • Удаление файлов по типу в Python в Windows
  • Проблема с кодировкой + encrypt + pad с использованием того же кода для python2 и python3
  • Как связать несколько wx.Dialogs в wxPython
  • Подсчитать количество вхождений данной подстроки в строку
  • Использование INSERT с помощью базы данных PostgreSQL с использованием Python
  • __metaclass__ в Python3.5
  • Получение Gunicorn для работы на порту 80
  • 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 - лучший язык программирования в мире.