SORU
3 ŞUBAT 2011, PERŞEMBE


Nasıl Sil ve deleteLater Qt sinyalleri ve yuvaları ile ilgili çalışır?

Sınıf QNetworkReply bir nesne var. Bir okuyucu (bazı diğer nesne) bitirdi bağlı() sinyali. Sinyal senkron (varsayılan olanlar). Tek bir konu var.

Bazı zamanlar bir anda nesneler de kurtulmak istiyorum. Onlardan daha sinyal falan yok. Gitmelerini istiyorum. Düşündüm de kullanacağım

delete obj1; delete obj2;

Ama gerçekten yapabilir miyim? ~QObject ki: için gözlük

Bekleyen olaylar teslim edilmesini beklerken bir QObject silme çökmesine neden olabilir.

Bu ne 'bekleyen olaylar'? Olabilir yani bu süre arıyorum benim delete, orada zaten bazı 'bekleyen olaylar' teslim edilmesi ve bu olabilir neden bir kaza ve ben gerçekten kontrol eden olursa?

Hadi diyorum ki:

obj1->deleteLater(); obj2->deleteLater();

Güvenli olması için.

Ama, gerçekten güvende miyim? deleteLater kontrol şuraya gelince ana döngü içinde ele alınacak bir olay ekler. Bekleyen bazı olaylar (sinyal) obj1 obj2 zaten orada, ana döngü içinde ele alınması için bekliyor olabilirönceele alınması deleteLater? Bu çok talihsiz olurdu. Kod yazmak için kontrol 'biraz' ve yuvaları benim. tüm gelen sinyali görmezden durum silinmiş istemiyorum

CEVAP
3 ŞUBAT 2011, PERŞEMBE


Silme QObjects iki temel kuralları takip ederseniz, genellikle güvenli (normal uygulama; atm farkında değilim patolojik durumlar olabilir yani):

  • Asla doğrudan veya dolaylı olarak bir tarafından çağrılan yuvası ya da bir yöntem bir nesne silmek (senkron, bağlantı tipi "") doğrudan silinecek nesneden sinyal. E. g. eğer bir sınıf İşlemi ile bir sinyal İşlem::tamamlandı() ve bir yuvası Müdürü::operationFinished () istemiyorsan silme işlemi nesne yayılan sinyal bu yuvası. Bu yöntem bitmiş yayan() sinyal "bu" yayarlar sonra (örneğin bir üye erişim), ve sonra "bu" işaretçi. geçersiz bir ameliyat erişme devam edebilir

  • Aynı şekilde, hiçbir nesne, olay işleyicisi, eşzamanlı olarak adlandırılır bu kod, bir nesneyi silmek. E. g. onun SomeWidget bir SomeWidget silmeyin::fooEvent() veya yöntemleri/yuva oradan ararsın. Olay sistem zaten silinmiş bir nesneye - ^ üzerinde çalışmaya devam eder . Crash.

Her ikisi de yanıltıcı olabilir izlemek, backtraces genellikle göz garip (Gibi kaza sırasında erişen bir ELMANIN iki üye değişken), özellikle ne zaman var karışık sinyal/slot zincirleri bir silme oluşabilir birkaç adım aşağı aslında başlatılan bir sinyal veya olay nesne silinir.

Bu gibi durumlarda deleteLater için en yaygın kullanım örneği). Geçerli olay kontrol sonra nesneyi siler olay döngü, döner önce tamamlanabilir kesinleştirir. Başka bir, genellikle iyi bir yoldur sıraya bağlantısı kullanarak bütün eylem erteleme buluyorum::/QMetaObject ınvokemethod( ..., Qt::QueuedConnection ).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BumbleDroid

    BumbleDroid

    18 EKİM 2010
  • Cole Rolland

    Cole Rolland

    23 Kasım 2008
  • paulandstorm

    paulandstorm

    4 EYLÜL 2006