'deki iletiler arasındaki iletişim Bazı verileri (python listesi) üreten ve ana iş parçasındaki verileri okuyacak ve görüntüleyecek bir pencere öğesi için kullanılabilen bir iş parçacığım var. Aslında , ben bu şekilde, verilere erişim sağlamak için QMutex kullanıyorum: bunlar jenerik verilerdir gibi ben emit()
verileri geçirerek değilimPySide
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)
Not (Ben PyObject kullanmaya çalıştı veri türü, ancak bir çift free()
programı çökmesine neden olur), ancak verileri deepcopy()
ile kopyalarım (verilerin bu şekilde kopyalanabileceğini varsayarak).
def get_data(self):
QMutexLock(self.mutex)
return self.data
sadece veri referansı kopyalarmış (? Sağda) ve veri paylaşılan VE dönüşten sonra kilidi olacağını ... mı bu: Ben bir kod gibi tahmin çünkü Bir deepcopy() kullanılır kod doğru mu? Veriler gerçekten büyükse (1'000'000 öğe listesi gibi) ne yapabilirim?
Teşekkürler.
P.S. Qt Mandelbrot example veya threading example with PyQt gibi bazı örnekler gördüm, ancak QImage'ı yuvalarda parametre olarak kullanıyorlar.
Btw, burada bir kusur olduğunu düşünüyorum slowly_produce_data() tüm verileri bir defada döndürür ve ardından bir nesne değişkenine atanır. Hiçbir muteks kullanılmaz, çünkü veri referansı bir kerede belirlenir (ve sanırım güvenlidir), ancak veriler döngüde üretildiyse ve sırayla (yani bir geri dönüşten değil) oluşturulmuşsa, o zaman da bir muteks gerekliydi. – AkiRoss