專利名稱:一種窗口防假死方法和裝置的制作方法
技術(shù)領(lǐng)域:
本申請(qǐng)涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別是涉及一種窗口防假死方法和裝置。
背景技術(shù):
Windows客戶端軟件是基于窗口結(jié)構(gòu)設(shè)計(jì)的。窗口之間有父子關(guān)系、兄弟關(guān)系等,windows操作系統(tǒng)會(huì)根據(jù)這些關(guān)系來(lái)管理窗口的顯示、焦點(diǎn)、窗口大小等,這大大減輕了windows開(kāi)發(fā)人員的工作。例如如果隱藏父窗口,那么所有父窗口的子窗口也會(huì)一起隱藏,并且失去焦點(diǎn),這些都是操作系統(tǒng)幫助實(shí)現(xiàn)的。這種設(shè)計(jì)也會(huì)有一些副作用,最嚴(yán)重的問(wèn)題之一就是子窗口卡住后,會(huì)導(dǎo)致父窗口也會(huì)卡住。例如子窗口在某個(gè)消息處理中發(fā)生假死、死循環(huán)等,此時(shí)再去操作父窗口,如改變父窗口大小、顯示、隱藏父窗口、設(shè)置父窗口屬性等,父窗口也會(huì)假死,導(dǎo)致整個(gè)窗口系統(tǒng)假死,那么如果想要打開(kāi)新的窗口,只能重啟窗口,給用戶帶來(lái)極大不便。其中,所述假死是窗口系統(tǒng)的的一種出問(wèn)題的狀態(tài),表現(xiàn)為界面不刷新,點(diǎn)擊任何按鈕沒(méi)有響應(yīng),無(wú)法進(jìn)行任何一種操作的狀態(tài)。比如,在多標(biāo)簽瀏覽器中,瀏覽器框架父窗口和瀏覽器子窗口,都是在同一個(gè)線程中的,當(dāng)瀏覽器子窗口出現(xiàn)問(wèn)題后,會(huì)直接導(dǎo)致整個(gè)父窗口假死、甚至崩潰,即導(dǎo)致整個(gè)瀏覽器處于假死狀態(tài)?,F(xiàn)有技術(shù)中,通過(guò)將父窗口、子窗口放在不同的進(jìn)程或者線程,該方法可以部分解決子窗口假死,框架父窗口也假死的問(wèn)題。當(dāng)子窗口假死后,其所在的線程不能處理任何消息,此時(shí)框架父窗口所在的線程如果不向該子窗口發(fā)送同步消息,則父窗口仍然可以相應(yīng)用戶的操作。對(duì)于該方案來(lái)說(shuō),由于windows操作系統(tǒng)對(duì)于具有父子關(guān)系、兄弟關(guān)系的窗口會(huì)做很多邏輯處理,例如,隱藏父窗口時(shí),會(huì)隱藏所有該父窗口的子窗口等,那么一旦某個(gè)子窗口假死,如果隱藏父窗口,那么父窗口還會(huì)向假死的子窗口發(fā)送同步消息,那么由于子窗口假死,父窗口也會(huì)接著假死,從而導(dǎo)致整個(gè)窗口系統(tǒng)假死,即使整個(gè)窗口系統(tǒng)處于假死狀態(tài)。比如,若瀏覽器當(dāng)前標(biāo)簽的子窗口假死后,隱藏瀏覽器框架父窗口時(shí),就會(huì)向假死的子窗口發(fā)送同步消息,從而導(dǎo)致整個(gè)瀏覽器假死。
發(fā)明內(nèi)容
本申請(qǐng)所要解決的技術(shù)問(wèn)題是提供一種窗口防假死方法和裝置,在Windows系統(tǒng)中從根本上解決了窗口系統(tǒng)的子窗口假死從而導(dǎo)致整個(gè)窗口系統(tǒng)假死的問(wèn)題。為了解決上述問(wèn)題,本申請(qǐng)公開(kāi)了一種窗口防假死方法,包括在通過(guò)一線程創(chuàng)建子窗口時(shí),先在與窗口系統(tǒng)各子窗口所在線程不同的線程中創(chuàng)建中間窗口 ;框架父窗口所述中間窗口為當(dāng)前創(chuàng)建子窗口的父窗口,所述中間窗口的父窗口為框架父窗口 ;所述當(dāng)前創(chuàng)建的子窗口所在線程與框架父窗口所在線程不同;檢測(cè)各子窗口是否假死,如果一子窗口假死,則將假死子窗口的假死消息發(fā)送給相應(yīng)中間窗口所在的線程;
通過(guò)所述中間窗口所在線程將中間窗口和所述假死子窗口從窗口框架中分離。優(yōu)選的,所述的分離包括分離中間窗口與框架父窗口的父子關(guān)系,和中間窗口對(duì)應(yīng)的子窗口的線程輸入消息循環(huán)與中間窗口對(duì)應(yīng)的框架父窗口的線程輸入消息循環(huán)的連接關(guān)系。優(yōu)選的,通過(guò)以下步驟進(jìn)行分離將所述子窗口的線程輸入消息循環(huán)從框架父窗口的線程輸入消息循環(huán)剝離;將所述子窗口對(duì)應(yīng)的中間窗口的父窗口設(shè)置為空;將所述子窗口對(duì)應(yīng)的中間窗口本身設(shè)置為不是孩子窗口的屬性。優(yōu)選的,通過(guò)以下步驟檢測(cè)各子窗口是否假死在框架父窗口啟動(dòng)后,啟動(dòng)假死窗口檢測(cè)線程;當(dāng)所述子窗口創(chuàng)建時(shí),將所述子窗口的窗口句柄存入假死窗口檢測(cè)線程的隊(duì)列中;檢測(cè)各子窗口的窗口句柄對(duì)應(yīng)的時(shí)間戳,所述窗口句柄對(duì)應(yīng)的時(shí)間戳由相應(yīng)子窗口所在線程更新;如果一窗口句柄對(duì)應(yīng)的時(shí)間戳未更新時(shí)間段超過(guò)閾值,則確認(rèn)相應(yīng)子窗口假死。優(yōu)選的,在將中間窗口和所述子窗口從窗口框架中分離后還包括當(dāng)所述子窗口恢復(fù)正常后,恢復(fù)所述中間窗口與所述子窗口的父子關(guān)系,和恢復(fù)所述框架父窗口與所述中間窗口的父子關(guān)系。優(yōu)選的,通過(guò)以下步驟恢復(fù)所述中間窗口與所述子窗口的父子關(guān)系,并恢復(fù)所述框架父窗口與所述中間窗口的父子關(guān)系將所述子窗口的線程輸入消息循環(huán)和框架父窗口的線程輸入消息循環(huán)連接;將所述子窗口對(duì)應(yīng)的中間窗口的屬性設(shè)置為具有孩子窗口屬性;將假死子窗口對(duì)應(yīng)的中間窗口的父窗口設(shè)置為框架父窗口。優(yōu)選的,通過(guò)中間窗口所在線程調(diào)用系統(tǒng)API函數(shù)AttachThreacHnput將所述子窗口的線程輸入消息循環(huán)從框架父窗口的線程輸入消息循環(huán)剝離;或?qū)⑺鲎哟翱诘木€程輸入消息循環(huán)和框架父窗口的線程輸入消息循環(huán)連接。優(yōu)選的,對(duì)于所述子窗口所在線程創(chuàng)建彈出窗口時(shí),查詢當(dāng)前彈出窗口是否在彈出窗口列表中存在;如果存在,調(diào)整當(dāng)前彈出窗口的屬性為只依賴所述子窗口所在線程。優(yōu)選的,當(dāng)所述子窗口退出時(shí),剝離所述中間窗口與所述子窗口與的父子關(guān)系,和剝離所述框架父窗口與所述中間窗口的父子關(guān)系;銷毀所述子窗口和中間窗口。優(yōu)選的,所述的框架父窗口為瀏覽器框架父窗口,所述子窗口為瀏覽器標(biāo)簽頁(yè)。相應(yīng)的,本申請(qǐng)還公開(kāi)了一種窗口防假死裝置,包括中間窗口創(chuàng)建模塊,在與子窗口所在線程不同的線程中創(chuàng)建中間窗口 ;框架父窗口所述中間窗口為所述子窗口的父窗口,所述中間窗口的父窗口為框架父窗口,所述子窗口所在線程與框架父窗口所在線程不同;假死窗口檢測(cè)模塊,用于檢測(cè)各子窗口是否假死,如果所述子窗口假死,則將假死子窗口的假死消息發(fā)送給相應(yīng)中間窗口所在的線程;
分離模塊,用于通過(guò)所述中間窗口所在線程將中間窗口和所述假死子窗口從窗口框架中分離。優(yōu)選的,所述的分離包括分離中間窗口與框架父窗口的父子關(guān)系,和中間窗口對(duì)應(yīng)的子窗口的線程輸入消息循環(huán)與中間窗口對(duì)應(yīng)的框架父窗口的線程輸入消息循環(huán)的連接關(guān)系。優(yōu)選的,所述分離模塊包括消息循環(huán)剝離單元,用于將所述子窗口的線程輸入消息循環(huán)從框架父窗口的線程輸入消息循環(huán)剝離;第一屬性設(shè)置單元,用于將所述子窗口對(duì)應(yīng)的中間窗口的父窗口設(shè)置為空;第二屬性設(shè)置單元,用于將所述子窗口對(duì)應(yīng)的中間窗口本身設(shè)置為不是孩子窗口的屬性。優(yōu)選的,所述假死窗口檢測(cè)模塊包括假死窗口檢測(cè)線程啟動(dòng)單元,在框架父窗口啟動(dòng)后,啟動(dòng)假死窗口檢測(cè)線程;窗口句柄存入單元,當(dāng)所述子窗口創(chuàng)建時(shí),將所述子窗口的窗口句柄存入假死窗口檢測(cè)線程的隊(duì)列中;假死判斷單元,檢測(cè)各子窗口的窗口句柄對(duì)應(yīng)的時(shí)間戳,所述時(shí)間戳由所述子窗口所在線程更新;如果一窗口句柄對(duì)應(yīng)的時(shí)間戳未更新時(shí)間段超過(guò)閾值,則確認(rèn)相應(yīng)子窗口假死。優(yōu)選的,還包括假死子窗口恢復(fù)模塊,用于當(dāng)所述子窗口恢復(fù)正常后,恢復(fù)所述中間窗口與所述子窗口的父子關(guān)系,和恢復(fù)所述框架父窗口與所述中間窗口的父子關(guān)系。優(yōu)選的,所述假死子窗口恢復(fù)模塊包括消息循環(huán)連接單元,用于將所述子窗口的線程輸入消息循環(huán)和框架父窗口的線程輸入消息循環(huán)連接;第三屬性設(shè)置單元,將所述子窗口對(duì)應(yīng)的中間窗口的屬性設(shè)置為具有孩子窗口屬性;第四屬性設(shè)置單元,將假死子窗口對(duì)應(yīng)的中間窗口的父窗口設(shè)置為框架父窗口。優(yōu)選的,通過(guò)中間窗口所在線程調(diào)用系統(tǒng)API函數(shù)AttachThreacHnput將所述子窗口的線程輸入消息循環(huán)從框架父窗口的線程輸入消息循環(huán)剝離;或?qū)⑺鲎哟翱诘木€程輸入消息循環(huán)和框架父窗口的線程輸入消息循環(huán)連接。優(yōu)選的,還包括彈出窗口處理單元,用于對(duì)于所述子窗口所在線程創(chuàng)建彈出窗口時(shí),查詢當(dāng)前彈出窗口是否在彈出窗口列表中存在;如果存在,調(diào)整當(dāng)前彈出窗口的屬性為只依賴所述子窗口所在線程。優(yōu)選的,還包括窗口銷毀單元,用于當(dāng)所述子窗口退出時(shí),剝離所述中間窗口與所述子窗口與的父子關(guān)系,和剝離所述框架父窗口與所述中間窗口的父子關(guān)系。優(yōu)選的,所述的框架父窗口為瀏覽器框架父窗口,所述子窗口為瀏覽器標(biāo)簽頁(yè)。與現(xiàn)有技術(shù)相比,本申請(qǐng)包括以下優(yōu)點(diǎn)
本申請(qǐng)通過(guò)在與子窗口所在線程不同的線程中創(chuàng)建中間窗口,所述中間窗口作為該子窗口的父窗口,并且所述中間窗口的父窗口設(shè)置為框架父窗口 ;如此當(dāng)所述子窗口假死時(shí),可以從窗口系統(tǒng)中將對(duì)應(yīng)該假死子窗口的中間窗口剝離,從而達(dá)到剝離假死子窗口的作用,避免了由于子窗口假死導(dǎo)致整個(gè)窗口系統(tǒng)的假死狀態(tài)。
圖1是本申請(qǐng)一種窗口防假死方法的流程示意圖;圖2是本申請(qǐng)優(yōu)選的一種窗口防假死方法的流程示意圖;圖3是本申請(qǐng)一種窗口防假死裝置的結(jié)構(gòu)示意圖;圖4是本申請(qǐng)優(yōu)選的一種窗口防假死裝置的結(jié)構(gòu)示意圖。
具體實(shí)施例方式為使本申請(qǐng)的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式
對(duì)本申請(qǐng)作進(jìn)一步詳細(xì)的說(shuō)明。在Windows系統(tǒng)下,所有的窗口(即有可顯示給用戶且可操作的窗口 )的程序都是消息驅(qū)動(dòng)的,也就是用戶操作鼠標(biāo)和鍵盤(pán)會(huì)產(chǎn)生各種消息,這些消息會(huì)分發(fā)到當(dāng)前系統(tǒng)有焦點(diǎn)的窗口( 一個(gè)系統(tǒng)中同一時(shí)刻僅有一個(gè)窗口有焦點(diǎn)),當(dāng)前焦點(diǎn)的窗口收到消息以后,會(huì)根據(jù)消息的不同類型做出不同的響應(yīng)。比如鼠標(biāo)按下,鍵盤(pán)按鍵等都會(huì)產(chǎn)生消息。根據(jù)這些消息,使應(yīng)用程序不斷做出響應(yīng),刷新界面,完成操作。系統(tǒng)內(nèi)部的消息處理方式為系統(tǒng)會(huì)把消息不斷防盜消息隊(duì)列里面,每個(gè)有窗口的執(zhí)行線程都有一個(gè)消息循環(huán),這個(gè)消息循環(huán)不斷的從消息隊(duì)列里面獲取消息,處理消息。但是如果處理消息部分發(fā)生了阻塞,一直沒(méi)有運(yùn)行完成,那么這個(gè)消息循環(huán)就不能獲取新的消息,這時(shí)再對(duì)這個(gè)界面進(jìn)行操作就不會(huì)響應(yīng)了,也就是出現(xiàn)假死。Windows客戶端軟件是基于窗口結(jié)構(gòu)設(shè)計(jì)的,也即在Windows系統(tǒng)下,窗口之間是有父子關(guān)系、兄弟關(guān)系等關(guān)系的。父子窗口之間的父子關(guān)系為當(dāng)父窗口移動(dòng)的時(shí)候,子窗口也必須移動(dòng);當(dāng)父窗口隱藏時(shí),子窗口也必須隱藏等。在多線程Windows環(huán)境,即父子窗口在不同的線程中時(shí),由于windows系統(tǒng)是基于父子關(guān)系管理父子窗口的,子窗口的所在線程的消息循環(huán)是在父窗口所在線程的消息循環(huán)中的;如果子窗口假死,即子窗口所在線程阻塞,那么如果父窗口進(jìn)行隱藏等動(dòng)作時(shí),父窗口所在線程再根據(jù)父子關(guān)系向子窗口所在線程發(fā)送消息進(jìn)行處理時(shí),由于子窗口所在線程阻塞,那么子窗口所在進(jìn)程就無(wú)法處理,從而無(wú)法發(fā)送處理后的響應(yīng)信息給父窗口所在線程,這就導(dǎo)致父窗口所在進(jìn)程也阻塞,從而整個(gè)窗口系統(tǒng)假死。而本申請(qǐng)就是基于Windows系統(tǒng)窗口的實(shí)際運(yùn)行原理,在子窗口假死時(shí),將子窗口從窗口系統(tǒng)中剝離出去,即剝離假死子窗口與框架父窗口的關(guān)系,這樣子窗口與父窗口的消息不相互依賴,即可防止整個(gè)窗口系統(tǒng)假死。參照?qǐng)D1,示出了本申請(qǐng)一種窗口防假死方法的流程示意圖,包括步驟110,在通過(guò)一線程創(chuàng)建子窗口時(shí),先在與窗口系統(tǒng)各子窗口所在線程不同的線程中創(chuàng)建中間窗口 ;框架父窗口所述中間窗口為當(dāng)前創(chuàng)建子窗口的父窗口,所述中間窗口的父窗口為框架父窗口 ;所述當(dāng)前創(chuàng)建的子窗口所在線程與框架父窗口所在線程不同。對(duì)于一個(gè)窗口系統(tǒng),在窗口系統(tǒng)啟動(dòng)后,其可能存在多個(gè)進(jìn)程,每個(gè)進(jìn)程中又存在多個(gè)線程管理窗口系統(tǒng)的框架父窗口和各子窗口。在窗口系統(tǒng)啟動(dòng)后,對(duì)于在該窗口系統(tǒng)中由線程B創(chuàng)建的子窗口,在該窗口系統(tǒng)的不同于創(chuàng)建各子窗口的線程中創(chuàng)建一個(gè)中間窗口,該中間窗口為所述在線程B中創(chuàng)建的子窗口的父窗口,并且該中間窗口為框架父窗口的子窗口。其中,所述子窗口所在線程與框架窗口所在線程也不相同。比如,對(duì)于一個(gè)瀏覽器,當(dāng)瀏覽器框架啟動(dòng)后,瀏覽器框架父窗口由該瀏覽器的進(jìn)程PA的線程TA創(chuàng)建,在創(chuàng)建瀏覽器子窗口時(shí),比如由進(jìn)程PA的線程TB創(chuàng)建子窗口 Wl時(shí),首先由與線程TB不同的一個(gè)線程比如TA創(chuàng)建一個(gè)中間窗口 M1,該中間窗口 Ml設(shè)置為子窗口 Wl的父窗口,同時(shí)設(shè)置該中間窗口的父窗口為框架父窗口。其中也可由線程TC創(chuàng)建中間窗口,但線程TC沒(méi)有創(chuàng)建管理任何其他子窗口,如果TC創(chuàng)建了子窗口 W2,那么對(duì)于前述子窗口 Wl,就不能用TC創(chuàng)建子窗口 Wl的中間窗口。其中,在設(shè)置窗口父子關(guān)系一般有兩個(gè)方法1 :Createwindow
HWND hWnd = CreateWindow (szAppName,// window
class name
TEXT (丨丨360se child"), // window captdwStyIe// window style100,Ilinitial χ position100,Ilinitial y position500,Ilinitial χ size500,Ilinitial y size
(HWND)g-hWndParent,// parent window
handle
NULL,// window menu handle
g-hlnstance,// program instance handle
NULL) ;// creation parameters2 創(chuàng)建時(shí)不設(shè)置父窗口,創(chuàng)建完后再設(shè)置父窗口。SetParent (hwnd, hParent);對(duì)于每一個(gè)瀏覽器的子窗口,均由與子窗口所在線程不同的線程創(chuàng)建一個(gè)中間窗口進(jìn)行上述相同的設(shè)置。比如,對(duì)于子窗口 W2,其所在線程為T(mén)C,也可采用線程TA創(chuàng)建一個(gè)中間窗口 M2,該中間窗口 M2設(shè)置為子窗口 W2的父窗口,同時(shí)設(shè)置該中間窗口的父窗口為框架父窗口。在本申請(qǐng)中,只要保證子窗口所在線程與中間窗口線程和框架父窗口線程均不相同即可,而對(duì)于中間窗口所在線程與框架父窗口所在線程是否相同本申請(qǐng)不加以限制。比如上述例子中,框架父窗口的線程為T(mén)A,子窗口的線程為T(mén)B,中間窗口的線程為T(mén)A,其中中間窗口也可采用其他沒(méi)創(chuàng)建子窗口的線程進(jìn)行創(chuàng)建等。另外,本申請(qǐng)對(duì)于子窗口,相應(yīng)的中間窗口和框架父窗口所在的進(jìn)程不加以限制。在實(shí)際中,一個(gè)窗口框架可能包括多個(gè)進(jìn)程,比如一個(gè)瀏覽器框架包括進(jìn)程PA和進(jìn)程PA,對(duì)于子窗口 Wl所在的進(jìn)程可以為進(jìn)程PA也可以為進(jìn)程PB,對(duì)于該子窗口的中間窗口 Ml所在的進(jìn)程也可以為進(jìn)程PA也可以為進(jìn)程PB,對(duì)于框架父窗口所在的進(jìn)程也可以為進(jìn)程PA也可以為進(jìn)程PB。步驟120,檢測(cè)各子窗口是否假死,如果所述子窗口假死,則將假死子窗口的假死消息發(fā)送給相應(yīng)中間窗口所在的線程。在通過(guò)前述步驟建立子窗口后,可建立一個(gè)假死窗口檢測(cè)線程,檢測(cè)各子窗口是否假死,如果某個(gè)子窗口假死,則將該假死子窗口的消息發(fā)送到該假死子窗口的中間窗口所在的進(jìn)程。優(yōu)選的,通過(guò)以下步驟檢測(cè)各子窗口是否假死步驟Sl 1,在框架父窗口啟動(dòng)后,啟動(dòng)假死窗口檢測(cè)線程。比如,對(duì)于瀏覽器來(lái)說(shuō),預(yù)先設(shè)置一個(gè)假死窗口檢測(cè)線程,在瀏覽器啟動(dòng)后,更進(jìn)一步的說(shuō),在瀏覽器的框架父窗口啟動(dòng)后,啟動(dòng)所述假死窗口檢測(cè)線程。步驟S12,當(dāng)所述子窗口創(chuàng)建時(shí),將所述子窗口的窗口句柄存入假死窗口檢測(cè)線程的隊(duì)列中。當(dāng)通過(guò)前述步驟創(chuàng)建子窗口時(shí),將該子窗口的窗口句柄存入假死窗口檢測(cè)線程的隊(duì)列中。所述的窗口句柄為句柄是個(gè)32位的數(shù),而不是指針,窗口句柄是窗口的身份標(biāo)志,調(diào)用API函數(shù)的時(shí)候,通過(guò)窗口句柄來(lái)判斷是哪個(gè)窗體使用了函數(shù)。一般的窗口句柄類型是HWND,還有實(shí)例句柄HINSTANCE、設(shè)備描述表句柄HDC等。其中,可通過(guò)如下方式獲取子窗口的句柄1 創(chuàng)建時(shí)記錄下來(lái)例如 HWND hffnd = Createffindow (...)2 根據(jù)窗口間的關(guān)系來(lái)獲取窗口句柄例如獲取窗口的父窗口,GetParent獲取所有子窗口,EnumThreadWindow3 根據(jù)窗口的進(jìn)程空間來(lái)獲取窗口 EnumThreadWindow 等。4 根據(jù)窗口的某個(gè)特征來(lái)查找窗孔Findffindow在實(shí)際中,獲取句柄的方式除了以上4中,還包括其他方式,本申請(qǐng)不對(duì)其加以限制。然后將所述窗口句柄存入假死窗口檢測(cè)線程的隊(duì)列中。步驟S13,檢測(cè)各子窗口的窗口句柄對(duì)應(yīng)的時(shí)間戳,所述時(shí)間戳由所述子窗口所在線程更新;如果一窗口句柄對(duì)應(yīng)的時(shí)間戳未更新時(shí)間段超過(guò)閾值,則確認(rèn)相應(yīng)子窗口假死。在一子窗口所在的線程輸入消息循環(huán)中,每次收到消息時(shí),表示該線程處于活著的狀態(tài),則由該線程更新所述子窗口對(duì)應(yīng)的時(shí)間戳。實(shí)際中,假死窗口檢測(cè)線程每隔一段時(shí)間檢測(cè)隊(duì)列中的各子窗口的窗口句柄對(duì)應(yīng)的時(shí)間戳,當(dāng)一窗口句柄對(duì)應(yīng)的時(shí)間戳未更新時(shí)間段超過(guò)閾值,則確認(rèn)窗口句柄對(duì)應(yīng)的子窗口假死。比如子窗口 Wl的窗口句柄對(duì)應(yīng)的時(shí)間戳為2011年12月M日21時(shí)50分四秒,如果假死窗口檢測(cè)線程為每1秒檢測(cè)一次,如果10秒后,窗口 Wl的窗口句柄對(duì)應(yīng)的時(shí)間戳仍為2011年12月M日21時(shí)50分四秒,那么窗口 Wl未更新時(shí)間段為10秒;如果設(shè)置未更新時(shí)間段的閾值為8秒,那么窗口 Wl的未更新時(shí)間段超過(guò)閾值,即可確認(rèn)窗口 Wl假死。然后,將該假死子窗口的消息發(fā)送到該假死子窗口的中間窗口所在的進(jìn)程。步驟130,通過(guò)所述中間窗口所在線程將中間窗口和所述假死子窗口從窗口框架中分離。所述的分離包括分離中間窗口與框架父窗口的父子關(guān)系,和中間窗口對(duì)應(yīng)的子窗口的線程輸入消息循環(huán)與中間窗口對(duì)應(yīng)的框架父窗口的線程輸入消息循環(huán)的連接關(guān)系。優(yōu)選的,通過(guò)以下步驟進(jìn)行分離步驟S21,將所述子窗口的線程輸入消息循環(huán)從框架父窗口的線程輸入消息循環(huán)剝離。優(yōu)選的,通過(guò)中間窗口所在線程調(diào)用系統(tǒng)API函數(shù)AttachThreacHnput將所述子窗口的線程輸入消息循環(huán)從框架父窗口的線程輸入消息循環(huán)剝離。在實(shí)際中API函數(shù)AttachThreadInput包括表一中的參數(shù)
權(quán)利要求
1.一種窗口防假死方法,其特征在于,包括在通過(guò)一線程創(chuàng)建子窗口時(shí),先在與窗口系統(tǒng)各子窗口所在線程不同的線程中創(chuàng)建中間窗口 ;框架父窗口所述中間窗口為當(dāng)前創(chuàng)建子窗口的父窗口,所述中間窗口的父窗口為框架父窗口 ;所述當(dāng)前創(chuàng)建的子窗口所在線程與框架父窗口所在線程不同;檢測(cè)各子窗口是否假死,如果一子窗口假死,則將假死子窗口的假死消息發(fā)送給相應(yīng)中間窗口所在的線程;通過(guò)所述中間窗口所在線程將中間窗口和所述假死子窗口從窗口框架中分離。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述的分離包括分離中間窗口與框架父窗口的父子關(guān)系,和中間窗口對(duì)應(yīng)的子窗口的線程輸入消息循環(huán)與中間窗口對(duì)應(yīng)的框架父窗口的線程輸入消息循環(huán)的連接關(guān)系。
3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,通過(guò)以下步驟進(jìn)行分離將所述子窗口的線程輸入消息循環(huán)從框架父窗口的線程輸入消息循環(huán)剝離;將所述子窗口對(duì)應(yīng)的中間窗口的父窗口設(shè)置為空;將所述子窗口對(duì)應(yīng)的中間窗口本身設(shè)置為不是孩子窗口的屬性。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,通過(guò)以下步驟檢測(cè)各子窗口是否假死在框架父窗口啟動(dòng)后,啟動(dòng)假死窗口檢測(cè)線程;當(dāng)所述子窗口創(chuàng)建時(shí),將所述子窗口的窗口句柄存入假死窗口檢測(cè)線程的隊(duì)列中;檢測(cè)各子窗口的窗口句柄對(duì)應(yīng)的時(shí)間戳,所述窗口句柄對(duì)應(yīng)的時(shí)間戳由相應(yīng)子窗口所在線程更新;如果一窗口句柄對(duì)應(yīng)的時(shí)間戳未更新時(shí)間段超過(guò)閾值,則確認(rèn)相應(yīng)子窗口假死。
5.據(jù)權(quán)利要求1所述的方法,其特征在于,在將中間窗口和所述子窗口從窗口框架中分離后還包括當(dāng)所述子窗口恢復(fù)正常后,恢復(fù)所述中間窗口與所述子窗口的父子關(guān)系,和恢復(fù)所述框架父窗口與所述中間窗口的父子關(guān)系。
6.據(jù)權(quán)利要求5所述的方法,其特征在于,通過(guò)以下步驟恢復(fù)所述中間窗口與所述子窗口的父子關(guān)系,并恢復(fù)所述框架父窗口與所述中間窗口的父子關(guān)系將所述子窗口的線程輸入消息循環(huán)和框架父窗口的線程輸入消息循環(huán)連接;將所述子窗口對(duì)應(yīng)的中間窗口的屬性設(shè)置為具有孩子窗口屬性;將假死子窗口對(duì)應(yīng)的中間窗口的父窗口設(shè)置為框架父窗口。
7.根據(jù)權(quán)利要求3或6所述的方法,其特征在于通過(guò)中間窗口所在線程調(diào)用系統(tǒng)API函數(shù)AttachThreacHnput將所述子窗口的線程輸入消息循環(huán)從框架父窗口的線程輸入消息循環(huán)剝離;或?qū)⑺鲎哟翱诘木€程輸入消息循環(huán)和框架父窗口的線程輸入消息循環(huán)連接。
8.據(jù)權(quán)利要求1所述的方法,其特征在于對(duì)于所述子窗口所在線程創(chuàng)建彈出窗口時(shí),查詢當(dāng)前彈出窗口是否在彈出窗口列表中存在;如果存在,調(diào)整當(dāng)前彈出窗口的屬性為只依賴所述子窗口所在線程。
9.據(jù)權(quán)利要求1所述的方法,其特征在于當(dāng)所述子窗口退出時(shí),剝離所述中間窗口與所述子窗口與的父子關(guān)系,和剝離所述框架父窗口與所述中間窗口的父子關(guān)系;銷毀所述子窗口和中間窗口。
10.根據(jù)權(quán)利要求1所述的方法,其特征在于所述的框架父窗口為瀏覽器框架父窗口,所述子窗口為瀏覽器標(biāo)簽頁(yè)。
11.一種窗口防假死裝置,其特征在于,包括中間窗口創(chuàng)建模塊,在與子窗口所在線程不同的線程中創(chuàng)建中間窗口 ;框架父窗口所述中間窗口為所述子窗口的父窗口,所述中間窗口的父窗口為框架父窗口,所述子窗口所在線程與框架父窗口所在線程不同;假死窗口檢測(cè)模塊,用于檢測(cè)各子窗口是否假死,如果所述子窗口假死,則將假死子窗口的假死消息發(fā)送給相應(yīng)中間窗口所在的線程;分離模塊,用于通過(guò)所述中間窗口所在線程將中間窗口和所述假死子窗口從窗口框架中分離。
12.根據(jù)權(quán)利要求11所述的裝置,其特征在于,所述的分離包括分離中間窗口與框架父窗口的父子關(guān)系,和中間窗口對(duì)應(yīng)的子窗口的線程輸入消息循環(huán)與中間窗口對(duì)應(yīng)的框架父窗口的線程輸入消息循環(huán)的連接關(guān)系。
13.據(jù)權(quán)利要求11或12所述的裝置,其特征在于,所述分離模塊包括消息循環(huán)剝離單元,用于將所述子窗口的線程輸入消息循環(huán)從框架父窗口的線程輸入消息循環(huán)剝離;第一屬性設(shè)置單元,用于將所述子窗口對(duì)應(yīng)的中間窗口的父窗口設(shè)置為空;第二屬性設(shè)置單元,用于將所述子窗口對(duì)應(yīng)的中間窗口本身設(shè)置為不是孩子窗口的屬性。
14.據(jù)權(quán)利要求11所述的裝置,其特征在于,所述假死窗口檢測(cè)模塊包括假死窗口檢測(cè)線程啟動(dòng)單元,在框架父窗口啟動(dòng)后,啟動(dòng)假死窗口檢測(cè)線程;窗口句柄存入單元,當(dāng)所述子窗口創(chuàng)建時(shí),將所述子窗口的窗口句柄存入假死窗口檢測(cè)線程的隊(duì)列中;假死判斷單元,檢測(cè)各子窗口的窗口句柄對(duì)應(yīng)的時(shí)間戳,所述時(shí)間戳由所述子窗口所在線程更新;如果一窗口句柄對(duì)應(yīng)的時(shí)間戳未更新時(shí)間段超過(guò)閾值,則確認(rèn)相應(yīng)子窗口假死。
15.據(jù)權(quán)利要求11所述的裝置,其特征在于,還包括假死子窗口恢復(fù)模塊,用于當(dāng)所述子窗口恢復(fù)正常后,恢復(fù)所述中間窗口與所述子窗口的父子關(guān)系,和恢復(fù)所述框架父窗口與所述中間窗口的父子關(guān)系。
16.據(jù)權(quán)利要求11所述的裝置,其特征在于,所述假死子窗口恢復(fù)模塊包括消息循環(huán)連接單元,用于將所述子窗口的線程輸入消息循環(huán)和框架父窗口的線程輸入消息循環(huán)連接;第三屬性設(shè)置單元,將所述子窗口對(duì)應(yīng)的中間窗口的屬性設(shè)置為具有孩子窗口屬性;第四屬性設(shè)置單元,將假死子窗口對(duì)應(yīng)的中間窗口的父窗口設(shè)置為框架父窗口。
17.根據(jù)權(quán)利要求13或16所述的裝置,其特征在于通過(guò)中間窗口所在線程調(diào)用系統(tǒng)API函數(shù)AttachThreacHnput將所述子窗口的線程輸入消息循環(huán)從框架父窗口的線程輸入消息循環(huán)剝離;或?qū)⑺鲎哟翱诘木€程輸入消息循環(huán)和框架父窗口的線程輸入消息循環(huán)連接。
18.據(jù)權(quán)利要求11所述的裝置,其特征在于,還包括彈出窗口處理單元,用于對(duì)于所述子窗口所在線程創(chuàng)建彈出窗口時(shí),查詢當(dāng)前彈出窗口是否在彈出窗口列表中存在;如果存在,調(diào)整當(dāng)前彈出窗口的屬性為只依賴所述子窗口所在線程。
19.據(jù)權(quán)利要求11所述的裝置,其特征在于,還包括窗口銷毀單元,用于當(dāng)所述子窗口退出時(shí),剝離所述中間窗口與所述子窗口與的父子關(guān)系,和剝離所述框架父窗口與所述中間窗口的父子關(guān)系。
20.根據(jù)權(quán)利要求11所述的裝置,其特征在于所述的框架父窗口為瀏覽器框架父窗口,所述子窗口為瀏覽器標(biāo)簽頁(yè)。
全文摘要
本申請(qǐng)?zhí)峁┝艘环N窗口防假死方法和裝置,涉及計(jì)算機(jī)技術(shù)領(lǐng)域。所述方法包括在通過(guò)一線程創(chuàng)建子窗口時(shí),先在與窗口系統(tǒng)各子窗口所在線程不同的線程中創(chuàng)建中間窗口,框架父窗口所述中間窗口為當(dāng)前創(chuàng)建子窗口的父窗口,所述中間窗口的父窗口為框架父窗口;所述當(dāng)前創(chuàng)建的子窗口所在線程與框架父窗口所在線程不同;如果一子窗口假死,則將假死子窗口的假死消息發(fā)送給相應(yīng)中間窗口所在線程;通過(guò)所述中間窗口所在線程將中間窗口和所述假死子窗口從窗口框架中分離。通過(guò)本申請(qǐng)可以從窗口系統(tǒng)中將對(duì)應(yīng)該假死子窗口的中間窗口剝離,避免由于子窗口假死導(dǎo)致整個(gè)窗口系統(tǒng)的假死狀態(tài),解決了Windows的窗口系統(tǒng)中由于子窗口假死從而導(dǎo)致整個(gè)窗口假死的問(wèn)題。
文檔編號(hào)G06F9/46GK102591711SQ201110452300
公開(kāi)日2012年7月18日 申請(qǐng)日期2011年12月29日 優(yōu)先權(quán)日2011年12月29日
發(fā)明者孫鵬, 李寶生, 陳志 申請(qǐng)人:奇智軟件(北京)有限公司