PySide

2010-05-12 15 views
15

'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.

+0

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

cevap

15

Sanırım bu PySide ile çalışmalı. küçük bir test dava ile Pyside Bugzilla'da (http://bugs.openbossa.org/) üzerinde bir hata rapor edin çalışmıyor ise: bu kod yüzünden işe yarayabilir:

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) 
İlgili konular