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
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 ).
JavaScript kilitler nasıl çalışır?...
CSS üçgenler nasıl çalışır?...
Veri bağlama Nasıl çalışır?AngularJS :...
Nasıl veritabanı indeksleme çalışır?...
Bit shift (bit-shift) operatörleri ned...