国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種事件系統(tǒng)的創(chuàng)建方法及裝置與流程

      文檔序號:12270933閱讀:160來源:國知局
      一種事件系統(tǒng)的創(chuàng)建方法及裝置與流程

      本發(fā)明涉及計算機領(lǐng)域,具體涉及一種事件系統(tǒng)的創(chuàng)建方法及裝置。



      背景技術(shù):

      在C++程序設(shè)計中,其總體設(shè)計原則是模塊化,將C++程序劃分為若干個模塊,每個模塊完成特定的功能,其中,事件機制可以有效解決模塊間的解耦問題,“繼承”、“關(guān)聯(lián)(Association)”、“事件”對應(yīng)的耦合度依次降低。事件系統(tǒng)就是創(chuàng)建一個事件映射表,該事件映射表包括一個事件名對應(yīng)一個或者多個處理函數(shù)的映射關(guān)系,其中,若處理函數(shù)是全局函數(shù)或者靜態(tài)成員函數(shù),則用指針存儲全局函數(shù)或者靜態(tài)成員函數(shù),若處理函數(shù)是非靜態(tài)成員函數(shù),通常需要給非靜態(tài)成員函數(shù)安插一個基類,例如:基類為EventCallback,在基類中聲明非靜態(tài)成員函數(shù)的指針類型。

      但是,當給非靜態(tài)成員函數(shù)安插一個基類時,則非靜態(tài)成員函數(shù)必須繼承自基類,與基類耦合,從而造成一個不友好的桎梏,若僅為響應(yīng)事件將非靜態(tài)成員函數(shù)與基類強耦合在一起,違背了設(shè)計原則,且給代碼設(shè)計帶來限制。



      技術(shù)實現(xiàn)要素:

      本發(fā)明實施例提供了一種事件系統(tǒng)的創(chuàng)建方法及裝置,用于解決現(xiàn)有非靜態(tài)成員函數(shù)與基類耦合時給代碼設(shè)計帶來限制的問題,不需要將非靜態(tài)成員函數(shù)強制繼承自基類,不影響代碼的設(shè)計。

      本發(fā)明第一方面提供一種事件系統(tǒng)的創(chuàng)建方法,包括:

      獲取待處理函數(shù),其中,所述待處理函數(shù)包括靜態(tài)成員函數(shù);

      將所述待處理函數(shù)生成目標函數(shù)對象;

      獲取所述目標函數(shù)對象對應(yīng)的事件名稱;

      根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)。

      本發(fā)明第二方面提供一種事件系統(tǒng)的創(chuàng)建裝置,包括:

      獲取模塊,用于獲取待處理函數(shù),其中,所述待處理函數(shù)包括非靜態(tài)成員函數(shù);

      生成模塊,用于將所述獲取模塊獲取的所述待處理函數(shù)生成目標函數(shù)對象;

      所述獲取模塊,還用于獲取所述生成模塊生成的所述目標函數(shù)對象對應(yīng)的事件名稱;

      創(chuàng)建模塊,用于根據(jù)所述生成模塊生成的所述目標函數(shù)對象和所述獲取模塊獲取的所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)。

      從以上技術(shù)方案可以看出,本發(fā)明實施例具有以下優(yōu)點:

      首先獲取待處理函數(shù),其中,該待處理函數(shù)包括非靜態(tài)成員函數(shù),此時,無需給非靜態(tài)成員函數(shù)安插一個基類,而是將待處理函數(shù)生成目標函數(shù)對象,通過目標函數(shù)對象和目標函數(shù)對象對應(yīng)的事件名稱創(chuàng)建事件系統(tǒng),減少模塊之間的耦合,不影響代碼的設(shè)計。

      附圖說明

      為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。

      圖1為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建裝置的一個結(jié)構(gòu)示意圖;

      圖2為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建方法的一個實施例示意圖;

      圖3為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建方法的另一個實施例示意圖;

      圖4為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建方法的另一個實施例示意圖;

      圖5為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建方法的另一個實施例示意圖;

      圖6為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建方法的代碼片段示意圖;

      圖7為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建裝置的另一個結(jié)構(gòu)示意圖;

      圖8為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建裝置的另一個結(jié)構(gòu)示意圖;

      圖9為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建裝置的另一個結(jié)構(gòu)示意圖;

      圖10為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建裝置的另一個結(jié)構(gòu)示意圖。

      具體實施方式

      本發(fā)明實施例提供了一種事件系統(tǒng)的生成方法及裝置,用于解決現(xiàn)有非靜態(tài)成員函數(shù)與基類耦合時給代碼設(shè)計帶來限制的問題,不需要將非靜態(tài)成員函數(shù)強制繼承自基類,不影響代碼的設(shè)計。

      下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。

      本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”、“第三”、“第四”等(如果存在)是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當情況下可以互換,以便這里描述的實施例能夠以除了在這里圖示或描述的內(nèi)容以外的順序?qū)嵤?。此外,術(shù)語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。

      在介紹本發(fā)明實施例之前,先介紹一下本發(fā)明實施例中的事件系統(tǒng),該事件系統(tǒng)包括目標函數(shù)對象和目標函數(shù)對象對應(yīng)的事件名稱的映射列表,其中,該目標函數(shù)對象為對處理函數(shù)(非靜態(tài)成員函數(shù),靜態(tài)成員函數(shù),全局函數(shù)等)包裝成的function函數(shù)對象,其實,由于將處理函數(shù)包裝在function函數(shù)的內(nèi)部,則不需要知道處理函數(shù)屬于哪個類,也就是不需要依賴這個類,相互之間獨立,消除了處理函數(shù)與基類的耦合,使之不影響對既有C++程序代碼的設(shè)計。該事件系統(tǒng)的使用非常簡單,可以很方便地應(yīng)用到既有的C++程序設(shè)計中,不需要對現(xiàn)有類的繼承樹進行修改,只要將成員函數(shù)或者全局函數(shù)定義為void eventHandler(any param)形式,成員函數(shù)可以是非靜態(tài)成員函數(shù)或者靜態(tài)成員函數(shù),若是非靜態(tài)成員函數(shù),由于非靜態(tài)成員函數(shù)有一個指向當前對象的指針this,則事件系統(tǒng)還可以維護該非靜態(tài)成員函數(shù)的指針this的對象生命期。

      本發(fā)明的技術(shù)方案可用于任何C++程序設(shè)計中,其中,該C++程序設(shè)計出的應(yīng)用可以是任何用于安裝在終端上的應(yīng)用,例如:學(xué)習(xí)應(yīng)用,游戲應(yīng)用,生活應(yīng)用等,此處不做具體限定,本發(fā)明的技術(shù)方案所創(chuàng)建的事件系統(tǒng)能夠減少模塊之間的耦合,減少代碼的復(fù)雜度。觸發(fā)事件的模塊只需要觸發(fā)出相應(yīng)的待處理事件,觸發(fā)事件的模塊不必清楚處理事件的模塊,處理事件的模塊只需要根據(jù)自己的需求處理自己感興趣的待處理事件,如果待處理事件中帶有參數(shù),事件系統(tǒng)的創(chuàng)建裝置檢測該參數(shù)是否符合預(yù)設(shè)的目標參數(shù)類型,若是,則調(diào)用處理函數(shù)處理該待處理事件,若否,則不能拋出異常事故信息,讓該待處理事件繼續(xù)往下傳遞,然后交給后續(xù)的處理函數(shù)進行處理。可見,如果沒有事件系統(tǒng),則需要將待處理事件的代碼都塞到事件觸發(fā)的模塊,使得代碼局部規(guī)模變得龐大而不便于維護。

      本發(fā)明的技術(shù)方案中,使用標準庫中的function函數(shù)將成員函數(shù)和全局函數(shù)包裝成一個function函數(shù)對象,則不需要通過安插一個基類從而硬性繼承耦合。對于非靜態(tài)成員函數(shù),事件系統(tǒng)可維護非靜態(tài)成員函數(shù)的this對象的生命期,簡化了內(nèi)存管理,非靜態(tài)成員函數(shù)的調(diào)用開銷與虛函數(shù)一致,以any作為事件處理函數(shù)的參數(shù),可以包容任何類型的待處理事件,且類型安全。

      請參閱圖1,對本發(fā)明涉及的事件系統(tǒng)的創(chuàng)建裝置100的具體結(jié)構(gòu)進行介紹,該事件系統(tǒng)的創(chuàng)建裝置可看作是應(yīng)用通信系統(tǒng)中的服務(wù)器,所述應(yīng)用通信系統(tǒng)還包括終端等,此處不做具體限定該事件系統(tǒng)的創(chuàng)建裝置100包括:收發(fā)器110、存儲器120、處理器130等部件。本領(lǐng)域技術(shù)人員可以理解,圖1中示出的該事件系統(tǒng)的創(chuàng)建裝置100的結(jié)構(gòu)并不構(gòu)成對第一服務(wù)器的限定,可以包括比圖1更多或更少的部件,或者組合某些部件,或者不同的部件布置。

      收發(fā)器110可用于收發(fā)信息,例如:信號的接收和發(fā)送。收發(fā)器110通過無線通信與終端等其他設(shè)備通信,無線通信可以使用任一通信標準或協(xié)議,包括但不限于全球移動通訊系統(tǒng)(英文全稱:Global System of Mobile communication,縮寫:GSM)、通用分組無線服務(wù)(英文全稱:General Packet Radio Service,縮寫:GPRS)、碼分多址(英文全稱:Code Division Multiple Access,縮寫:CDMA)、寬帶碼分多址(英文全稱:Wideband Code Division Multiple Access,縮寫:WCDMA)、長期演進(英文全稱:Long Term Evolution,縮寫:LTE)、電子郵件、短消息服務(wù)(英文全稱:Short Messaging Service,縮寫:SMS)等。

      存儲器120可用于存儲軟件程序以及模塊,處理器130通過運行存儲在存儲器120的軟件程序以及模塊,從而執(zhí)行該事件系統(tǒng)的創(chuàng)建裝置100的各種功能應(yīng)用以及數(shù)據(jù)處理。

      其中,處理器130用于執(zhí)行如下步驟:

      獲取待處理函數(shù),其中,所述待處理函數(shù)包括非靜態(tài)成員函數(shù);

      將所述待處理函數(shù)生成目標函數(shù)對象;

      獲取所述目標函數(shù)對象對應(yīng)的事件名稱;

      根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)。

      在一些可能的實現(xiàn)方式中,處理器130根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)包括:

      根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱形成映射列表,并根據(jù)所述映射列表創(chuàng)建所述事件系統(tǒng)。

      在一些可能的實現(xiàn)方式中,處理器130根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)之后,將所述事件系統(tǒng)通過圖map表或者哈希hash表存儲。

      在一些可能的實現(xiàn)方式中,處理器130根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)之前,確定所述目標函數(shù)對象的目標參數(shù)類型;

      處理器130將所述事件系統(tǒng)通過圖map表或者哈希hash表存儲之后,獲取待處理事件;若所述待處理事件所包括的參數(shù)類型符合所述目標參數(shù)類型,則調(diào)用所述目標函數(shù)對象處理所述待處理事件。

      在一些可能的實現(xiàn)方式中,處理器130確定所述目標函數(shù)對象的目標參數(shù)類型包括:

      從源代碼boost庫中的參數(shù)類型中確定所述目標函數(shù)對象的目標參數(shù)類型;

      或者,從智能指針創(chuàng)建出的參數(shù)類型中確定所述目標函數(shù)對象的目標參數(shù)類型;

      或者,從C++內(nèi)置的參數(shù)類型中確定所述目標函數(shù)對象的目標參數(shù)類型。

      在一些可能的實現(xiàn)方式中,處理器130確定所述目標函數(shù)對象的目標參數(shù)類型之后,獲取所述目標參數(shù)類型的變量;

      通過所述目標參數(shù)類型的變量維護所述目標函數(shù)對象的生命期。

      在一些可能的實現(xiàn)方式中,處理器130通過所述目標參數(shù)類型的變量維護所述目標函數(shù)對象的生命期包括:

      若處理所述待處理事件,則將所述目標參數(shù)類型的變量所對應(yīng)的引用計數(shù)從第一值增加至第二值;

      若結(jié)束處理所述待處理事件,則將所述目標參數(shù)類型的變量所對應(yīng)的引用計數(shù)從所述第二值降低至所述第一值。

      請參閱圖2,為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建方法的一個實施例示意圖,該實施例的具體流程如下:

      步驟201、獲取待處理函數(shù),其中,所述待處理函數(shù)包括非靜態(tài)成員函數(shù)。

      本發(fā)明實施例中,待處理函數(shù)至少包括非靜態(tài)成員函數(shù),該待處理函數(shù)還可以包括靜態(tài)成員函數(shù)或者全局函數(shù),在實際應(yīng)用中,為了兼容C++程序設(shè)計中的所有模塊,該待處理函數(shù)包括非靜態(tài)成員函數(shù),靜態(tài)成員函數(shù)和全局函數(shù)。

      其中,函數(shù)本質(zhì)上是全局的,因為一個函數(shù)要被另外的函數(shù)調(diào)用,但是,也可以指定函數(shù)只能被本文件調(diào)用,而不能被其他文件調(diào)用,根據(jù)函數(shù)能否被其他文件調(diào)用,將函數(shù)區(qū)分為靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)。如果一個函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為靜態(tài)成員函數(shù)。使用靜態(tài)成員函數(shù),可以使函數(shù)只局限于所在文件。通常把只能由同一文件使用的函數(shù)和外部變量放在一個文件中,在它們前面都冠以static使之局部化,其他文件不能引用。在定義函數(shù)時,如果在函數(shù)首部的最左端冠以關(guān)鍵字extern,則表示此函數(shù)是非靜態(tài)成員函數(shù),可供其他文件調(diào)用。在需要調(diào)用此函數(shù)的文件中,用extern聲明所用的函數(shù)時非靜態(tài)成員函數(shù)。

      步驟202、將所述待處理函數(shù)生成目標函數(shù)對象。

      與現(xiàn)有技術(shù)不同的是,將待處理函數(shù)生成目標函數(shù)對象,若該待處理函數(shù)是非靜態(tài)成員函數(shù),則無需對該非靜態(tài)成員函數(shù)安插一個基類,而是將非靜態(tài)函數(shù)生成目標函數(shù)對象,其中,該目標函數(shù)對象可以是使用標準庫中的function函數(shù)將非靜態(tài)成員函數(shù)包裝成一個function函數(shù)對象,則不需要通過安插一個基類從而硬性繼承耦合。

      步驟203、獲取所述目標函數(shù)對象對應(yīng)的事件名稱。

      在實際應(yīng)用中,由于是將待處理函數(shù)生成目標函數(shù)對象的,則根據(jù)待處理函數(shù)對應(yīng)的事件名稱作為該目標函數(shù)對象對應(yīng)的事件名稱。

      步驟204、根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)。

      本發(fā)明實施例中,根據(jù)目標函數(shù)對象和目標函數(shù)對象對應(yīng)的事件名稱創(chuàng)建事件系統(tǒng),即一個目標函數(shù)對象對應(yīng)一個事件名稱,然后統(tǒng)計多個目標函數(shù)對象對應(yīng)多個事件名稱,從而創(chuàng)建該事件系統(tǒng),則不需要再將事件的代碼都塞到事件觸發(fā)的模塊,從而便于維護代碼的局部規(guī)模。

      在圖2所示實施例的基礎(chǔ)上,請參閱圖3,為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建方法的另一個實施例示意圖,該實施例的具體流程如下:

      步驟301、獲取待處理函數(shù),其中,所述待處理函數(shù)包括非靜態(tài)成員函數(shù)。

      步驟302、將所述待處理函數(shù)生成目標函數(shù)對象。

      步驟303、獲取所述目標函數(shù)對象對應(yīng)的事件名稱。

      需要說明的是,步驟301至步驟303與圖2所示的步驟201至步驟203相同或者相似,具體可參閱步驟201至步驟203的描述,此處不再贅述。

      步驟304、根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)。

      本發(fā)明實施例中,根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)的方式有很多種,在一些可能的實現(xiàn)方式中,所述根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)包括:根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱形成映射列表,并根據(jù)所述映射列表創(chuàng)建所述事件系統(tǒng)。

      可見,先將目標函數(shù)對象和目標函數(shù)對象對應(yīng)的事件名稱形成映射列表后,再根據(jù)該映射列表創(chuàng)建事件系統(tǒng),從而便于后續(xù)直接從事件系統(tǒng)中查找目標函數(shù)對象,以及目標函數(shù)對象對應(yīng)的事件名稱。

      步驟305、將所述事件系統(tǒng)通過圖map表或者哈希hash表存儲。

      本發(fā)明實施例中,若事件量比較小,則事件系統(tǒng)使用map存儲,若事件量比較大,則使用hash存儲,例如:boost庫的order_map,可見,根據(jù)事件量的大小合理的選取存儲方式,具體可根據(jù)實際情況而定,此處不做具體限定。

      在圖3所示實施例的基礎(chǔ)上,請參閱圖4,為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建方法的另一個實施例示意圖,該實施例的具體流程如下:

      步驟401、獲取待處理函數(shù),其中,所述待處理函數(shù)包括非靜態(tài)成員函數(shù)。

      步驟402、將所述待處理函數(shù)生成目標函數(shù)對象。

      步驟403、獲取所述目標函數(shù)對象對應(yīng)的事件名稱。

      需要說明的是,步驟401至步驟403與圖2所示的步驟201至步驟203相同或者相似,具體可參閱步驟201至步驟203的描述,此處不再贅述。

      步驟404、確定所述目標函數(shù)對象的目標參數(shù)類型。

      本發(fā)明實施例中,任何參數(shù)類型都可以作為目標函數(shù)對象的參數(shù)類型,但是,在實際應(yīng)用中,只需要將符合目標參數(shù)類型的待處理事件進行處理,因此,需要確定目標函數(shù)對象的目標參數(shù)類型,其中,確定目標函數(shù)對象的目標參數(shù)類型的方式有很多種,在一些可能的實現(xiàn)方式中,所述確定所述目標函數(shù)對象的目標參數(shù)類型包括:從源代碼boost庫中的參數(shù)類型中確定所述目標函數(shù)對象的目標參數(shù)類型;或者,從智能指針創(chuàng)建出的參數(shù)類型中確定所述目標函數(shù)對象的目標參數(shù)類型;或者,從C++內(nèi)置的參數(shù)類型中確定所述目標函數(shù)對象的目標參數(shù)類型。

      在實際應(yīng)用中,目標函數(shù)對象的參數(shù)類型可以是boost::any類型,可以接納任何類型的參數(shù),大大增加了參數(shù)類型的通用性,還可以用各種C++內(nèi)置的基本類型,還可以用目標函數(shù)對象的智能指針來創(chuàng)建出來的復(fù)雜參數(shù)類型。則從目標函數(shù)對象的參數(shù)類型中隨機或者按照某種預(yù)設(shè)規(guī)則確定該目標參數(shù)類型,此處不做具體限定。

      步驟405、根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)。

      步驟406、將所述事件系統(tǒng)通過圖map表或者哈希hash表存儲。

      需要說明的是,步驟405和步驟406與圖3所述的步驟304和步驟305相同或者相似,具體可參閱步驟304和步驟305的描述,此處不做具體限定。

      步驟407、獲取待處理事件。

      本發(fā)明實施例中,需要獲取待處理事件,然后通過事件系統(tǒng)判斷是否響應(yīng)該待處理事件。

      步驟408、若所述待處理事件所包括的參數(shù)類型符合所述目標參數(shù)類型,則調(diào)用所述目標函數(shù)對象處理所述待處理事件。

      在實際應(yīng)用中,每個待處理事件都有包括的參數(shù)類型,若該待處理事件的參數(shù)類型符合該目標參數(shù)類型,則調(diào)用該目標函數(shù)對象處理該待處理事件,否則,將該待處理事件交給后續(xù)的目標函數(shù)對象進行處理。

      在圖4所示實施例的基礎(chǔ)上,請參閱圖5,為本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建方法的另一個實施例示意圖,該實施例的具體流程如下:

      步驟501、獲取待處理函數(shù),其中,所述待處理函數(shù)包括非靜態(tài)成員函數(shù)。

      步驟502、將所述待處理函數(shù)生成目標函數(shù)對象。

      步驟503、獲取所述目標函數(shù)對象對應(yīng)的事件名稱。

      步驟504、確定所述目標函數(shù)對象的目標參數(shù)類型。

      步驟505、根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)。

      步驟506、將所述事件系統(tǒng)通過圖map表或者哈希hash表存儲。

      步驟507、獲取待處理事件。

      步驟508、若所述待處理事件所包括的參數(shù)類型符合所述目標參數(shù)類型,則調(diào)用所述目標函數(shù)對象處理所述待處理事件。

      需要說明的是,步驟501至步驟508與圖4所示的步驟401至步驟408相同或者相似,具體可參閱步驟401至步驟408的描述,此處不再贅述。

      步驟509、獲取所述目標參數(shù)類型的變量。

      步驟510、通過所述目標參數(shù)類型的變量維護所述目標函數(shù)對象的生命期。

      本發(fā)明實施例中,通過所述目標參數(shù)類型的變量維護所述目標函數(shù)對象的生命期的方式有很多種,在一些可能的實現(xiàn)方式中,所述通過所述目標參數(shù)類型的變量維護所述目標函數(shù)對象的生命期包括:若處理所述待處理事件,則將所述目標參數(shù)類型的變量所對應(yīng)的引用計數(shù)從第一值增加至第二值;若結(jié)束處理所述待處理事件,則將所述目標參數(shù)類型的變量所對應(yīng)的引用計數(shù)從所述第二值降低至所述第一值。因此,通過維護目標函數(shù)對象的生命期,保障當目標函數(shù)對象處于事件系統(tǒng)中時,目標函數(shù)對象不被析構(gòu),即不被脫離作用域。

      可見,使用標準庫中的function函數(shù)將待處理函數(shù)包裝成一個目標函數(shù)對象,而不需要知道該待處理函數(shù)定義在哪個類中,消除了待處理函數(shù)與基類的耦合,使之不影響對既有C++程序代碼的設(shè)計。其中,非靜態(tài)成員函數(shù)帶有一個this指針,將非靜態(tài)成員函數(shù)包裝成function函數(shù)對象后,若this指針指涉的對象被析構(gòu)后,function函數(shù)對象執(zhí)行會導(dǎo)致程序崩潰,可用智能指針(share_ptr)與function函數(shù)對象合作,共同維護this指針的生命期。

      另外,待處理函數(shù)的參數(shù)能接納所有的類型,其中,C++不同于C#、java,所有的參數(shù)類型都有一個共同的基類Object,而C++中沒有這種共同的基類,因此,選用boost::any作為待處理函數(shù)的參數(shù)類型,可以包羅各種參數(shù)類型。還有,不需要強制繼承自EventListerner基類,就可以方便地使用事件系統(tǒng)來響應(yīng)事件。

      在實際應(yīng)用中,如圖6所示,為建模語言(英文全稱:Unified Modeling Language,縮寫:UML)的一個使用范例圖,其中,EvnetSlot直譯為事件槽。如果“事件系統(tǒng)”是一張表的話,表中的每一項就是一個EventSlot,EvnetSlot中的_funAddress是function的地址,用于當刪除待處理函數(shù)時,查找function用。_call是一個function函數(shù)對象,待處理函數(shù)是包裝在這個變量中的。EventSlot(call:function<void(any)>&,funAddress:void*)是一個構(gòu)造函數(shù),創(chuàng)建一個EventSlot對象時,會調(diào)用此函數(shù)。

      EventService是事件系統(tǒng)類,它里面有一個m_dispatchTable變量,其實,它是一張表,這張表里面存放了很多個項數(shù)據(jù)。每一項數(shù)據(jù)有兩個成員,一個是string(事件名稱),一個是list<EventSlot*>(是事件槽列表),一個事件被觸發(fā)時,可以執(zhí)行多個處理函數(shù),其中,一個事件槽包裝了一個事件處理函數(shù)。Dispatch(name:string,arg:any&)是觸發(fā)一個事件(name),事件的參數(shù)是arg在事件系統(tǒng)的內(nèi)部會調(diào)用與該事件關(guān)聯(lián)的事件處理函數(shù)(list<EventSlot*>,參考EventService中的m_dispatchTable),Remove(name:string,fun:Func),刪除一個事件的待處理函數(shù),當一個待處理函數(shù)被刪除后,事件觸發(fā)時,該函數(shù)不會被執(zhí)行。

      TestClass是一個測試的類,它有一個成員函數(shù)(DoSomthing(param:any&)),用于充當待處理函數(shù),TestClass*p=new TestClass()表示創(chuàng)建一個TestClass對象,然后賦值給指針變量p,shared_ptr<TestClass>ptr(p)表示定義一個智能指針對象,將指針變量p賦值給它。EventService*d=new EventService()表示創(chuàng)建一個事件系統(tǒng)對象,然后賦值給指針變量d。d->register("EVENT_TEST",&TestClass::DoSomething,ptr)表示注冊一個名為EVENT_TEST的事件,待處理函數(shù)是TestClass::DoSomething,類對象的指針用shared_ptr包裝成變量ptr。d->Dispatch("EVENT_TEST")表示觸發(fā)事件EVENT_TEST,事件系統(tǒng)內(nèi)部會調(diào)用ptr->DoSomething()函數(shù),d->Remove("EVENT_TEST",&TestClass::DoSomething)表示刪除EVENT_TEST事件的待處理函數(shù)TestClass::DoSomething。

      當我們調(diào)用Register函數(shù)將成員函數(shù)注冊到事件系統(tǒng)中時,會將智能指針ptr與TestClass::Dosomething包裝成一個function,賦值雌EventSlot成員_call(function),function內(nèi)部會有一個變量來存儲ptr對象,智能指針有一個特性,就是將一個智能指針保存(也就是賦值)在另一個智能指針時,智能指針維護的對象的引用計數(shù)就會加1,只要對象的引用計數(shù)不為0,該對象就不會被刪除。

      假設(shè)TestClass::DoSomething被用作非靜態(tài)成員函數(shù),但是TestClass不需要被迫繼承自一個基類,即被EventListerner類“侵入”(intrusive),TestClass與基類不存在“繼承”這種強制耦合,只是需要按照格式聲明非靜態(tài)成員函數(shù)。這樣有效簡化了使用事件系統(tǒng)的步驟,最關(guān)鍵的是事件系統(tǒng)的相關(guān)類型不會“侵入”到既有類的C++程序設(shè)計中。

      本發(fā)明的技術(shù)方案中,將成員函數(shù),全局函數(shù)全部包裝成一個function函數(shù)對象,作為待處理事件的處理函數(shù)。然后建立一張映射表,即一張事件名稱與function函數(shù)對象的對應(yīng)表,當一個事件發(fā)生后,查看該映射表,找到與此事件名稱對應(yīng)的function函數(shù)對象,然后執(zhí)行該function函數(shù)對象。function函數(shù)對象的參數(shù)類型是boost::any類型,可以接納任何類型的參數(shù),大大增加了參數(shù)類型的通用性。還可以用使用各種C++內(nèi)置的基本類型,還可以使用智能指針來創(chuàng)建出來的復(fù)雜參數(shù)類型,而不用擔心function函數(shù)對象的生命期,由于任何類型的參數(shù)都是可以接納的,使用十分方便。

      在圖6所示的UML圖中的使用范例中,使用share_ptr來管理新創(chuàng)建出來的TestClass對象,一并將其注冊到事件系統(tǒng)中,由事件系統(tǒng)來維護該對象的生命期。將p交由ptr管理,起始階段,智能指針對p的引用計數(shù)為1,當將ptr與TestClass::DoSomething()注冊到事件系統(tǒng)后,智能指針對p的引用計數(shù)為2,當不需要處理事件后,將TestClass::DoSomething從事件系統(tǒng)中移除,p對的引用計數(shù)降為1,但是,當程序執(zhí)行到超出ptr對象的作用域之外時,p對象才真正被析構(gòu)掉。因此,事件系統(tǒng)可用來管理非靜態(tài)成員函數(shù)的this對象的生命期,保障當非靜態(tài)成員函數(shù)處于事件系統(tǒng)中時,該this對象不被析構(gòu)。

      在實際應(yīng)用中,也可以選擇人工來維護this對象的生命期,其中,注冊事件的函數(shù)提供了多個重載版本可供選擇:

      第一種是注冊成員函數(shù),人工維護this對象的生命期,具體函數(shù)如下:

      template<typename Func,typename This>

      void Register(const std::string&name,Func fun,This*pThis)。

      第二種是注冊成員函數(shù),事件系統(tǒng)維護this對象的生命期,具體函數(shù)如下:

      template<typename Func,typename This>

      void Register(const std::string&name,Func fun,std::tr1::shared_ptr<This>pThis)。

      第三種是注冊全局函數(shù),具體函數(shù)如下:

      template<typename Func>

      void Register(const std::string&name,Func fun)。

      其中,第一種Register函數(shù),是注冊一個成員函數(shù),第二種Regioster函數(shù),也是注冊一個成員函數(shù),與第一個Register函數(shù)的區(qū)別在于它傳入的是一個由智能指針(share_ptr)包裝過的this指針,而第一個Register函數(shù)傳入的是一個沒有包裝過的。如果用share_ptr包裝過后,外面刪掉該變量,不會影響事件系統(tǒng)。第三種Register函數(shù),是注冊全局函數(shù)。

      事件系統(tǒng)使用boost庫中的any類型作為事待處理函數(shù)的參數(shù)類型,它可以包容所有類型,在發(fā)送事件時,可以將任何類型參數(shù)(param)傳到待處理函數(shù),待處理函數(shù)可以檢查param類型是不是與自己期待的類型,如果是就處理待處理事件,如果不是則忽略,如下函數(shù)代碼:

      為便于更好的實施本發(fā)明實施例的上述相關(guān)方法,下面還提供用于配合上述方法的相關(guān)裝置。

      請參閱圖7,本發(fā)明實施例中事件系統(tǒng)的創(chuàng)建裝置700的一個結(jié)構(gòu)示意圖,該事件系統(tǒng)的創(chuàng)建裝置700包括獲取模塊701,生成模塊702和創(chuàng)建模塊703。

      獲取模塊701,用于獲取待處理函數(shù),其中,所述待處理函數(shù)包括非靜態(tài)成員函數(shù);

      生成模塊702,用于將所述獲取模塊701獲取的所述待處理函數(shù)生成目標函數(shù)對象;

      所述獲取模塊701,還用于獲取所述生成模塊702生成的所述目標函數(shù)對象對應(yīng)的事件名稱;

      創(chuàng)建模塊703,用于根據(jù)所述生成模塊702生成的所述目標函數(shù)對象和所述獲取模塊701獲取的所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)。

      在圖7所示事件系統(tǒng)的的創(chuàng)建裝置的基礎(chǔ)上,請參閱圖8,所述創(chuàng)建模塊703具體用于根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱形成映射列表,并根據(jù)所述映射列表創(chuàng)建所述事件系統(tǒng)。

      所述事件系統(tǒng)的創(chuàng)建裝置700還包括:

      存儲模塊704,用于所述創(chuàng)建模塊703根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)之后,將所述事件系統(tǒng)通過圖map表或者哈希hash表存儲。

      在圖8所示事件系統(tǒng)的的創(chuàng)建裝置的基礎(chǔ)上,請參閱圖9,所述事件系統(tǒng)的創(chuàng)建裝置700還包括:

      確定模塊705,用于所述創(chuàng)建模塊703根據(jù)所述目標函數(shù)對象和所述目標函數(shù)對象對應(yīng)的所述事件名稱創(chuàng)建事件系統(tǒng)之前,確定所述目標函數(shù)對象的目標參數(shù)類型;

      在一些可能的實現(xiàn)方式中,所述確定模塊705具體用于從源代碼boost庫中的參數(shù)類型中確定所述目標函數(shù)對象的目標參數(shù)類型;或者,從智能指針創(chuàng)建出的參數(shù)類型中確定所述目標函數(shù)對象的目標參數(shù)類型;或者,從C++內(nèi)置的參數(shù)類型中確定所述目標函數(shù)對象的目標參數(shù)類型。

      所述獲取模塊701,還用于所述存儲模塊704將所述事件系統(tǒng)通過圖map表或者哈希hash表存儲之后,獲取待處理事件;

      處理模塊706,用于若所述獲取模塊701獲取的所述待處理事件所包括的參數(shù)類型符合所述目標參數(shù)類型,則調(diào)用所述目標函數(shù)對象處理所述待處理事件。

      在圖9所示事件系統(tǒng)的的創(chuàng)建裝置的基礎(chǔ)上,請參閱圖10,所述事件系統(tǒng)的創(chuàng)建裝置700還包括:

      所述獲取模塊701,還用于所述確定模塊705確定所述目標函數(shù)對象的目標參數(shù)類型之后,獲取所述目標參數(shù)類型的變量;

      維護模塊707,用于通過所述目標參數(shù)類型的變量維護所述目標函數(shù)對象的生命期。

      在一些可能的實現(xiàn)方式中,所述維護模塊707具體用于若處理所述待處理事件,則將所述目標參數(shù)類型的變量所對應(yīng)的引用計數(shù)從第一值增加至第二值;若結(jié)束處理所述待處理事件,則將所述目標參數(shù)類型的變量所對應(yīng)的引用計數(shù)從所述第二值降低至所述第一值。

      可見,獲取模塊701首先獲取待處理函數(shù),其中,該待處理函數(shù)包括非靜態(tài)成員函數(shù),此時,無需給非靜態(tài)成員函數(shù)安插一個基類,而是生成模塊702將待處理函數(shù)生成目標函數(shù)對象,創(chuàng)建模塊703通過目標函數(shù)對象和目標函數(shù)對象對應(yīng)的事件名稱創(chuàng)建事件系統(tǒng),減少模塊之間的耦合,不影響代碼的設(shè)計。

      所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統(tǒng),裝置和單元的具體工作過程,可以參考前述方法實施例中的對應(yīng)過程,在此不再贅述。

      在本申請所提供的幾個實施例中,應(yīng)該理解到,所揭露的系統(tǒng),裝置和方法,可以通過其它的方式實現(xiàn)。例如,以上所描述的裝置實施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。

      所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。

      另外,在本發(fā)明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用軟件功能單元的形式實現(xiàn)。

      所述集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,可以存儲在一個計算機可讀取存儲介質(zhì)中。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:U盤、移動硬盤、只讀存儲器(ROM,Read-Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。

      以上所述,以上實施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡管參照前述實施例對本發(fā)明進行了詳細的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當理解:其依然可以對前述各實施例所記載的技術(shù)方案進行修改,或者對其中部分技術(shù)特征進行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實施例技術(shù)方案的精神和范圍。

      當前第1頁1 2 3 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1