第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

關(guān)于Qt中的信號(hào)和插槽,delete和deleteLater如何工作?

關(guān)于Qt中的信號(hào)和插槽,delete和deleteLater如何工作?

素胚勾勒不出你 2019-12-26 10:17:45
有一個(gè)QNetworkReply類的對(duì)象。有一個(gè)插槽(在其他對(duì)象中)連接至其finish()信號(hào)。信號(hào)是同步的(默認(rèn)信號(hào))。只有一個(gè)線程。在某個(gè)時(shí)刻,我想擺脫兩個(gè)對(duì)象。沒(méi)有更多信號(hào)或來(lái)自它們的任何東西。我希望他們走了。好吧,我想,我會(huì)用delete obj1; delete obj2;但是我真的可以嗎??QObject的規(guī)范說(shuō):在等待事件發(fā)送時(shí)刪除QObject可能導(dǎo)致崩潰。什么是“待處理事件”?這是否意味著在我打電話給我時(shí)delete,已經(jīng)有一些“待處理事件”要傳遞,并且它們可能會(huì)導(dǎo)致崩潰,而我真的無(wú)法檢查是否有任何事件?假設(shè)我打電話給:obj1->deleteLater(); obj2->deleteLater();為了安全。但是,我真的很安全嗎?該deleteLater補(bǔ)充說(shuō),將在主回路控制時(shí)到達(dá)那里進(jìn)行處理的事件。是否可以存在obj1或obj2已經(jīng)存在一些未決事件(信號(hào)),在處理deleteLater 之前在主循環(huán)中等待處理?那將是非常不幸的。我不想編寫(xiě)代碼來(lái)檢查“某種程度上已刪除”狀態(tài),而忽略所有插槽中的傳入信號(hào)。
查看完整描述

3 回答

?
翻閱古今

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊

如果遵循以下兩個(gè)基本規(guī)則,則刪除QObject通常是安全的(即,在正常實(shí)踐中;可能是我不了解atm的病理情況):

  • 切勿刪除插槽(或方法)中的對(duì)象,該插槽或方法被(同步,連接類型“直接”)信號(hào)直接或間接從要?jiǎng)h除的對(duì)象中調(diào)用。例如,如果您有一個(gè)帶有信號(hào)Operation :: finished()和插槽Manager :: operationFinished()的類Operation,則不想刪除在該插槽中發(fā)出信號(hào)的操作對(duì)象。發(fā)出finished()信號(hào)的方法可能會(huì)在發(fā)出之后繼續(xù)訪問(wèn)“ this”(例如訪問(wèn)成員),然后對(duì)無(wú)效的“ this”指針進(jìn)行操作。

  • 同樣,切勿刪除從對(duì)象的事件處理程序中同步調(diào)用的代碼中的對(duì)象。例如,請(qǐng)勿在其SomeWidget :: fooEvent()或從此處調(diào)用的方法/插槽中刪除SomeWidget。事件系統(tǒng)將繼續(xù)對(duì)已刪除的對(duì)象->崩潰進(jìn)行操作。

由于回溯通??雌饋?lái)很奇怪(就像訪問(wèn)POD成員變量時(shí)崩潰一樣),尤其是當(dāng)您具有復(fù)雜的信號(hào)/插槽鏈(其中刪除可能會(huì)發(fā)生幾步下降,最初是由信號(hào)或事件發(fā)起的)時(shí),兩者都很難追蹤。被刪除的對(duì)象。

這種情況是deleteLater()的最常見(jiàn)用例。它確保當(dāng)前事件可以在控件返回到事件循環(huán)之前完成,事件循環(huán)然后刪除該對(duì)象。我發(fā)現(xiàn),另一個(gè)更好的方法通常是使用排隊(duì)的連接/ QMetaObject :: invokeMethod(...,Qt :: QueuedConnection)延遲整個(gè)操作。


查看完整回答
反對(duì) 回復(fù) 2019-12-26
?
吃雞游戲

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

您推薦的文檔的后兩行給出了答案。


從?QObject,


在等待事件發(fā)送時(shí)刪除QObject可能導(dǎo)致崩潰。如果QObject與當(dāng)前正在執(zhí)行的線程不在同一線程中,則不能直接刪除它。使用deleteLater()代替,這將導(dǎo)致事件循環(huán)在所有未決事件傳遞到對(duì)象后刪除該對(duì)象。


它明確表示我們不要從其他線程中刪除。由于您只有一個(gè)線程應(yīng)用程序,因此刪除是安全的QObject。


否則,如果您必須在多線程環(huán)境deleteLater()中將其刪除,請(qǐng)使用它將QObject在處理完所有事件后將其刪除。


查看完整回答
反對(duì) 回復(fù) 2019-12-26
?
慕桂英546537

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊

您可以閱讀有關(guān)以下內(nèi)容之一的Delta對(duì)象規(guī)則來(lái)找到問(wèn)題的答案:


信號(hào)安全(SS)。

從一個(gè)對(duì)象的信號(hào)之一調(diào)用的插槽中調(diào)用對(duì)象(包括析構(gòu)函數(shù))上的方法必須是安全的。


分段:


QObject的核心是支持在發(fā)信號(hào)時(shí)刪除。為了利用它,您只需確保您的對(duì)象在刪除后不嘗試訪問(wèn)其自己的成員。但是,大多數(shù)Qt對(duì)象不是以這種方式編寫(xiě)的,也不要求它們兩者都存在。因此,如果需要在對(duì)象的信號(hào)之一期間刪除對(duì)象,建議始終調(diào)用deleteLater(),因?yàn)椤皠h除”可能會(huì)使應(yīng)用程序崩潰。


不幸的是,何時(shí)使用“ delete”和deleteLater()并不總是很清楚。也就是說(shuō),代碼路徑具有信號(hào)源并不總是很明顯。通常,您可能會(huì)有一段代碼在今天安全的某些對(duì)象上使用“刪除”,但是在將來(lái)的某個(gè)時(shí)候,同一代碼塊最終會(huì)從信號(hào)源中被調(diào)用,現(xiàn)在您的應(yīng)用程序突然崩潰了。解決此問(wèn)題的唯一通用方法是始終使用deleteLater(),即使乍一看似乎沒(méi)有必要。


通常,我認(rèn)為Delta對(duì)象規(guī)則是每個(gè)Qt開(kāi)發(fā)人員必須閱讀的內(nèi)容。這是極好的閱讀材料。


查看完整回答
反對(duì) 回復(fù) 2019-12-26
  • 3 回答
  • 0 關(guān)注
  • 1947 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)