2012-06-27 38 views
5

Üzerinde çalıştığım bazı kaynak kodlarını inceliyordum. Birinin kodladığı tuhaf bir ifade buldum. Kaynak kodu bir QML GUI ile bir GUI uygulamasıdır ve QT 4.7.x kullanır.QObject tabanlı sınıfın kendi başına bir bağlantı var.

Aşağıdaki kod parçacığı temel uygulama mantığına aittir.

// connect signal-slots for decoupling 
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection); 

Bu nesne aslında yani bir sıraya bağlantısıyla kendisine bağlayan bu garip aynı anda farklı evrelerde may "canlı" nesne?

İlk bakışta Benim için hiçbir anlam ifade etmedi. Böyle bir bağlantının neden makul ya da ihtiyaç duyulduğu konusunda herhangi bir sebep düşünebilir mi? Bu işe yarar mı?

cevap

9

Sorunsuz çalışacaktır. Belki SetCurrentTaskSlot çağırmadan önce bazı olay döngü işleme gerekiyordu?

QueuedConnection öğesinin bir şeyin farklı iş parçacığında olduğu anlamına gelmediğini unutmayın. QueuedConnection, yalnızca sinyal verildiğinde, ilgili yuvaya doğrudan çağrılmayacağı anlamına gelir. Olay döngüsünde sıraya konacak ve denetim olay döngüsüne geri verileceği zaman işlenecektir.

+0

Anlam ifade eder. Ben hala kodu çevreleyen şeylere bakıyorum. Bu yüzden neler olduğunu net bir şekilde geri alacağım. –

+1

Bu yüzden, bir hesaplama yapılırken bir görev değişikliği sinyali yayınlanmış gibi görünüyor ve "değişim" hemen gerçekleşmemeli, ancak geçerli akış yürütüldükten ve olay işleme devam edildikten sonra. –

3

Kuyrukta bağlantı, alıcının nerede yaşadığıyla ilgili hiçbir şey ima etmeyecektir. Tersi doğrudur: başka bir iş parçacığında yaşayan bir nesneye güvenli bir şekilde sinyal göndermek için sıraya alınmış bağlantılar kullanmalısınız. Ama onları herhangi bir iş parçasında yaşayan bir nesne için kullanabilirsiniz!

Bir sinyalin, iletimin olay döngüsü içinden iletilmesini ve doğrudan bağlantıyla olduğu gibi yayma sitesinden hemen olmamasını sağlamak için kuyruğa alınmış bir bağlantı kullanılır. Doğrudan bağlantı kavramsal olarak bir liste üzerindeki işlev işaretçilerine çağrı kümesidir. Sıralı bağlantı, kavramsal olarak, olayın içeriğine bağlı olarak bir işlev çağrısını yürüten akıllı bir alıcıya gönderilen bir olaydır.

Olay, iç olay QMetaCallEvent ve bu olay üzerinde hareket eden ve çağrı yürüten QObject::event olduğunu.