【问题标题】:Communication between threads in PySidePySide中线程之间的通信
【发布时间】:2011-02-18 20:51:19
【问题描述】:

我有一个线程,它产生一些数据(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() 会使程序崩溃),但我正在复制带有deepcopy() 的数据(假设可以像这样复制数据)。 我使用 deepcopy() 是因为我猜想这样的代码:

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

只会复制对数据的引用(对吗?),数据将在返回后共享和解锁...... 这段代码正确吗? 如果数据非常大(例如 1'000'000 个项目的列表),我该怎么办?

谢谢。

附:我看到了一些示例,例如Qt Mandelbrot examplethreading example with PyQt,但它们使用 QImage 作为插槽中的参数。

【问题讨论】:

  • 顺便说一句,我认为这里有一个缺陷:这段代码可能会起作用,因为 slow_produce_data() 一次返回所有数据,然后分配给一个对象变量。没有使用互斥锁,因为数据引用是一次性设置的(我认为是安全的),但是如果数据是在循环中生成的,并且是按顺序构建的(即不是从返回中),那么那里也需要一个互斥锁。

标签: python multithreading pyqt pyqt4 pyside


【解决方案1】:

我认为这应该适用于 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多