我有一个线程,它产生一些数据(一个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 作为数据类型,但是 doublefree()
会使程序崩溃),但我正在使用 a 复制数据deepcopy()
(假设数据可以是像这样复制)。我使用了 deepcopy() 因为我猜想这样的代码:
def get_data(self):
QMutexLock(self.mutex)
return self.data
只会复制对数据的引用(对吗?),数据将在返回后被共享和解锁……这段代码正确吗?如果数据非常大(例如 1'000'000 个项目的列表),我该怎么办?
谢谢。
PS 我看到了一些示例,例如Qt Mandelbrot 示例或PyQt 的线程示例,但它们使用 QImage 作为插槽中的参数。