專利名稱:實現(xiàn)函數(shù)托管的方法和數(shù)據(jù)處理設(shè)備的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種實現(xiàn)函數(shù)管控的方法和設(shè)備,特別是涉及一種實現(xiàn)函數(shù)托管的方 法和數(shù)據(jù)處理設(shè)備。
背景技術(shù):
隨著計算機軟件技術(shù)的不斷發(fā)展,構(gòu)件化軟件技術(shù)已經(jīng)越來越普及,各種各樣的 構(gòu)件技術(shù)和支持這些構(gòu)件技術(shù)的相應(yīng)的嵌入式操作系統(tǒng)也應(yīng)運而生。目前,人們在利用構(gòu)件化軟件系統(tǒng)平臺進行編程時,例如,在上??铺┦兰o科技有 限公司開發(fā)的Elastos平臺上進行編程時,可能希望得到進程退出的通知,以在進程退出 進入準備結(jié)束狀態(tài)時做些資源清理的工作,或者在進程退出進入準備結(jié)束狀態(tài)時需要設(shè)置 一些標志、發(fā)送消息通知等等,然而,要實現(xiàn)上述目的還存在如下的問題問題一雖然說主線程退出就代表著進程退出,但這存在兩個約束。第一、主線程 退出時返回的只是進入主線程的消息循環(huán),并不表示當前進程或者主線程已經(jīng)結(jié)束退出, 當進入消息循環(huán)以后就離開了用戶的代碼,用戶無法確切知道消息循環(huán)何時結(jié)束、主線程 何時退出;第二、在進程運行過程中,某個子模塊或者加載的第三方DLL庫無法修改這個進 程的主線程或其他超過它范圍的代碼,也就不能在主線程退出時獲得調(diào)用自己的代碼的時 機。問題二 雖然用戶可以利用“線程托管函數(shù)”的方式將函數(shù)托管到主線程上,在主 線程上托管一個函數(shù),當主線程結(jié)束退出時會調(diào)用這個函數(shù),從而間接地得到通知,但這個 托管的函數(shù)的調(diào)用必須在主線程執(zhí)行,對用戶來說這種手段比較繁瑣,如果要托管的函數(shù) 很多,不同的函數(shù)可能依附于不同的線程,不同的函數(shù)可能由不同的代碼、甚至不同的第三 方的代碼來創(chuàng)建等,這些情況導致這種手段操作起來更加復雜、更容易出錯,甚至會破壞程 序結(jié)構(gòu)。
發(fā)明內(nèi)容
鑒于以上內(nèi)容,有必要提供一種實現(xiàn)函數(shù)托管的方法,以提高函數(shù)托管效率、避免 函數(shù)托管錯誤且防止破壞程序結(jié)構(gòu)。此外,還有必要提供一種實現(xiàn)函數(shù)托管的數(shù)據(jù)處理設(shè)備,以提高函數(shù)托管效率、避 免函數(shù)托管錯誤且防止破壞程序結(jié)構(gòu)。一種實現(xiàn)函數(shù)托管的方法,適用于能運行構(gòu)件化軟件系統(tǒng)的數(shù)據(jù)處理設(shè)備。該 方法包括步驟(a)定義函數(shù)的托管函數(shù)、自動釋放全局托管對象函數(shù)及析構(gòu)函數(shù);(b)執(zhí) 行定義的托管函數(shù)將需托管的函數(shù)托管給進程;(c)執(zhí)行定義的自動釋放全局托管對象函 數(shù),將被托管的函數(shù)的指針插入全局托管對象的托管對象鏈表;(d)等待所托管的進程結(jié) 束;(e)在所托管的進程退出進入準備結(jié)束狀態(tài)時,定義的自動釋放全局托管對象函數(shù)自 動釋放全局托管對象,進入定義的析構(gòu)函數(shù);(f)執(zhí)行定義的析構(gòu)函數(shù)遍歷全局托管對象 的托管對象鏈表,調(diào)用并執(zhí)行所有被托管的函數(shù)。
一種實現(xiàn)函數(shù)托管的數(shù)據(jù)處理設(shè)備,該數(shù)據(jù)處理設(shè)備包括存儲器及處理器。該存 儲器用于存儲構(gòu)件化軟件系統(tǒng)。該處理器用于運行存儲的構(gòu)件化軟件系統(tǒng)中的函數(shù)托管模 塊,以執(zhí)行以下步驟(Π)定義函數(shù)的托管函數(shù)、自動釋放全局托管對象函數(shù)及析構(gòu)函數(shù); ( 2)執(zhí)行定義的托管函數(shù)將需托管的函數(shù)托管給進程;(i3)執(zhí)行定義的自動釋放全局托 管對象函數(shù),將被托管的函數(shù)的指針插入全局托管對象的托管對象鏈表;(i4)等待所托管 的進程結(jié)束;(i5)在所托管的進程退出進入準備結(jié)束狀態(tài)時,定義的自動釋放全局托管對 象函數(shù)自動釋放全局托管對象,進入定義的析構(gòu)函數(shù);(i6)執(zhí)行定義的析構(gòu)函數(shù)遍歷全局 托管對象的托管對象鏈表,調(diào)用并執(zhí)行所有被托管的函數(shù)。相較現(xiàn)有技術(shù),本發(fā)明通過在構(gòu)件化軟件系統(tǒng)中利用函數(shù)的托管函數(shù)將需要托管 的函數(shù)托管給進程,在所托管的進程退出進入準備結(jié)束狀態(tài)時利用析構(gòu)函數(shù)調(diào)用并執(zhí)行被 托管的函數(shù),提高了函數(shù)的托管效率,避免了函數(shù)的托管錯誤和程序結(jié)構(gòu)的破壞。
圖1是本發(fā)明實現(xiàn)函數(shù)托管的數(shù)據(jù)處理設(shè)備較佳實施例的結(jié)構(gòu)示意圖。圖2是本發(fā)明實現(xiàn)函數(shù)托管的方法較佳實施例的具體實施流程圖。
具體實施例方式如圖1所示,是本發(fā)明實現(xiàn)函數(shù)托管的數(shù)據(jù)處理設(shè)備較佳實施例的結(jié)構(gòu)示意圖。 該數(shù)據(jù)處理設(shè)備1可以是計算機、手機、個人數(shù)字助理(Personal Digital Assistant,PDA) 等。該數(shù)據(jù)處理設(shè)備1包括處理器11及存儲器(圖中未示出)。該存儲器用于存儲能實現(xiàn) 函數(shù)托管的構(gòu)件化軟件系統(tǒng)10。該構(gòu)件化軟件系統(tǒng)10包括一個函數(shù)托管模塊100。該處 理器11用于運行存儲的構(gòu)件化軟件系統(tǒng)10中的函數(shù)托管模塊100以實現(xiàn)函數(shù)的托管。如圖2所示,是本發(fā)明實現(xiàn)函數(shù)托管的方法較佳實施例的具體實施流程圖。該方 法適用于圖1所示的數(shù)據(jù)處理設(shè)備1。以下是結(jié)合本實施例逐步實現(xiàn)函數(shù)托管的內(nèi)容,即該處理器11運行存儲的構(gòu)件 化軟件系統(tǒng)10中的函數(shù)托管模塊100逐步實現(xiàn)函數(shù)托管的內(nèi)容。步驟S10,在為構(gòu)件化軟件系統(tǒng)10提供的函數(shù)構(gòu)建界面中,定義函數(shù)的托管函數(shù)、 自動釋放全局托管對象函數(shù)及析構(gòu)函數(shù),并執(zhí)行定義的托管函數(shù)對需托管的函數(shù)進行托管。在本實施例中,是以托管C語言風格的函數(shù)為例進行說明的;在本發(fā)明的其他實 施例中,其他語言風格(例如C++語言風格)的函數(shù)實施情況與C語言風格的函數(shù)實施情 況相類似,因此,在不付出創(chuàng)造性勞動的情況下,本技術(shù)領(lǐng)域的技術(shù)人員應(yīng)當能夠通過以C 語言風格的函數(shù)為例的實施情況,輕易實現(xiàn)所有其他語言風格的函數(shù)基于本發(fā)明技術(shù)方案 的實施情況。以下是C語言風格的函數(shù)的托管函數(shù)與C++語言風格的函數(shù)的托管函數(shù)相類 似情況的部分展示(I)C語言風格的函數(shù)的托管函數(shù)的聲明typedef Void (*PProcessExitRoutine)(PVoid);STATIC CARAPI eProcess:AtExit(/*[in]*/PProcessExitRoutine pEntry,//C 語言風格的函數(shù)指針
/*[in]*/PVoid pUserData) ;//用戶調(diào)用上下文(2) C++語言風格的函數(shù)的托管函數(shù)的聲明template<class T>STATIC CARAPI eProcess::AtExit (/*[in]*/T*pThis,//C++ 的 class 對象指針/* [in] */void (Τ *pEntry) ()) ;//class 的成員函數(shù)指針于本實施例步驟SlO中,可以定義函數(shù)的托管函數(shù)如下typedef Void(*PProcessExitRoutine)(PVoid);STATIC CARAPI eProcess:AtExit(/*[in]*/PProcessExitRoutine pEntry,//C 語言風格的函數(shù)指針/*[in]*/PVoid pUserData) ;//用戶調(diào)用上下文Void OnExit (PVoid pUserData)//—個由用戶實現(xiàn)的函數(shù),預(yù)期在進程結(jié)束時被 調(diào)用{assert ((Int32) pUserData = = 0x1234) ;// 預(yù)期 pUserData = = 0x1234CThread: Sleep (1000, NULL) -J/ 使當前線程睡眠 1 秒鐘CConsole: WriteLine ( “In OnExit function. · · ”);// 打印到屏幕輸出}ECode UserRoutineC ..W用戶實現(xiàn)的某個線程函數(shù){CConsole: WriteLine ( "Entered UserRoutine. · · ”);// 打印到屏幕輸出eProcess: AtExit (&0nExit, (PVoid) 0x1234) ;//將函數(shù)托管給當前進程CConsole: WriteLine ( "Leaving UserRoutine. · · ”);// 打印到屏幕輸出return N0ERR0R;//退出用戶代碼}ECode ElastosMain (...) //Elastos 平臺程序的入 口 函數(shù){IThread^pThreadCConsole: WriteLine ( "Before CThread New (),,);//打印到屏幕輸出CThread: :New(&UserRoutine,O, NULL, &pThread) ;// 創(chuàng)建一個新線程運行 UserRoutinepThread- > Join (INFINITE, NULL) ;// 等待線程結(jié)束CConsole: WriteLine ( "After JoinO ”);//打印到屏幕輸出return N0ERR0R_EXIT ;//直接退出程序}C:\Test. exe[Enter]//屏幕輸出,在控制臺下執(zhí)行上面的測試程序Before CThread: New()Entered UserRoutine...Leaving UserRoutine...
5
After JoinOIn OnExit function... C \」丨程序結(jié)束,退出到用戶的控制臺從上面可以看到,借助eProcess: =AtExit函數(shù)即可將函數(shù)托管給當前進程,當 進程結(jié)束時,會自動調(diào)用被托管的函數(shù)。從屏幕輸出可知,當用戶的Join返回后,退出了 ElastosMain,但進程并沒有立即結(jié)束,而是進入被托管的函數(shù)OnExit中,當OnExit結(jié)束 后,進程才真正退出。類似的,用戶也可以將一個C++語言風格的函數(shù)托管給進程,只是定 義的托管函數(shù)與上述C語言風格的函數(shù)的托管函數(shù)有所區(qū)別,但效果完全一樣。同時,用戶 也可以將多個函數(shù)托管給一個進程,這些被托管的函數(shù)會在所托管的進程退出進入準備結(jié) 束狀態(tài)時按照注冊順序的相反順序被調(diào)用執(zhí)行。于本實施例步驟SlO中,可以定義自動釋放全局托管對象函數(shù)如下class CAutoRun{· · · }CAutoRun g_autoRun ;ECode eProcess:AtExit([in]*/PProcessExitRoutine pEntry,/* [in] */PVoid pUserData) //進行函數(shù)托管實現(xiàn)的偽代碼{g_autoRun. GetList (&pList) ;//從進程的全局托管對象上獲取托管對象鏈表pList- > Insert (pEntry,pUserData) ;//將被托管的函數(shù)的指針插入全局托管 對象的托管對象鏈表return N0ERR0R ;}于本實施例步驟SlO中,可以定義析構(gòu)函數(shù)如下CAutoRun CAutoRun (){pList = m_pList- > FirstO ;while (pList) {//遍歷托管對象鏈表,調(diào)用并執(zhí)行被托管的函數(shù)pList- > GetCurrent (&pEntry, &pUserData) ;// 從節(jié)點上獲得被托管的函數(shù)pEntry (pUserData) ;//調(diào)用被托管的函數(shù)pList = pList- > Next () ;// 繼續(xù)遍歷鏈表}}步驟S11,執(zhí)行定義的自動釋放全局托管對象函數(shù),將被托管的函數(shù)的指針插入全 局托管對象的托管對象鏈表。步驟S12,等待所托管的進程結(jié)束。步驟S13,在所托管的進程退出進入準備結(jié)束狀態(tài)時,定義的自動釋放全局托管對 象函數(shù)自動釋放全局托管對象,進入定義的析構(gòu)函數(shù)。步驟S15,執(zhí)行定義的析構(gòu)函數(shù)遍歷全局托管對象的托管對象鏈表,調(diào)用并執(zhí)行所有被托管的函數(shù)。 最后所應(yīng)說明的是,以上實施例僅用以說明本發(fā)明的技術(shù)方案而非限制,盡管參 照較佳實施例對本發(fā)明進行了詳細說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當理解,可以對本發(fā)明 的技術(shù)方案進行修改或等同替換,而不脫離本發(fā)明技術(shù)方案的精神和范圍。
權(quán)利要求
一種實現(xiàn)函數(shù)托管的方法,適用于能運行構(gòu)件化軟件系統(tǒng)的數(shù)據(jù)處理設(shè)備,其特征在于,該方法包括步驟定義函數(shù)的托管函數(shù)、自動釋放全局托管對象函數(shù)及析構(gòu)函數(shù);執(zhí)行定義的托管函數(shù),將需托管的函數(shù)托管給進程;執(zhí)行定義的自動釋放全局托管對象函數(shù),將被托管的函數(shù)的指針插入全局托管對象的托管對象鏈表;等待所托管的進程結(jié)束;在所托管的進程退出進入準備結(jié)束狀態(tài)時,定義的自動釋放全局托管對象函數(shù)自動釋放全局托管對象,進入定義的析構(gòu)函數(shù);及執(zhí)行定義的析構(gòu)函數(shù)遍歷全局托管對象的托管對象鏈表,調(diào)用并執(zhí)行所有被托管的函數(shù)。
2.如權(quán)利要求1所述的實現(xiàn)函數(shù)托管的方法,其特征在于,所述數(shù)據(jù)處理設(shè)備包括計 算機、手機、個人數(shù)字助理。
3.如權(quán)利要求1或2所述的實現(xiàn)函數(shù)托管的方法,其特征在于,所述構(gòu)件化軟件系統(tǒng)是 嵌入式操作系統(tǒng)。
4.如權(quán)利要求1或2所述的實現(xiàn)函數(shù)托管的方法,其特征在于,所述函數(shù)包括C語言風 格的函數(shù)及C++語言風格的函數(shù)。
5.一種實現(xiàn)函數(shù)托管的數(shù)據(jù)處理設(shè)備,其特征在于,該數(shù)據(jù)處理設(shè)備包括 存儲器,用于存儲構(gòu)件化軟件系統(tǒng);處理器,用于運行存儲的構(gòu)件化軟件系統(tǒng)中的函數(shù)托管模塊,以執(zhí)行以下步驟 定義函數(shù)的托管函數(shù)、自動釋放全局托管對象函數(shù)及析構(gòu)函數(shù); 執(zhí)行定義的托管函數(shù),將需托管的函數(shù)托管給進程;執(zhí)行定義的自動釋放全局托管對象函數(shù),將被托管的函數(shù)的指針插入全局托管對象的 托管對象鏈表;等待所托管的進程結(jié)束;在所托管的進程退出進入準備結(jié)束狀態(tài)時,定義的自動釋放全局托管對象函數(shù)自動釋 放全局托管對象,進入定義的析構(gòu)函數(shù);及執(zhí)行定義的析構(gòu)函數(shù)遍歷全局托管對象的托管對象鏈表,調(diào)用并執(zhí)行所有被托管的函數(shù)。
6.如權(quán)利要求5所述的實現(xiàn)函數(shù)托管的數(shù)據(jù)處理設(shè)備,其特征在于,所述數(shù)據(jù)處理設(shè) 備包括計算機、手機、個人數(shù)字助理。
7.如權(quán)利要求5或6所述的實現(xiàn)函數(shù)托管的數(shù)據(jù)處理設(shè)備,其特征在于,所述構(gòu)件化軟 件系統(tǒng)是嵌入式操作系統(tǒng)。
8.如權(quán)利要求5或6所述的實現(xiàn)函數(shù)托管的數(shù)據(jù)處理設(shè)備,其特征在于,所述函數(shù)包括 C語言風格的函數(shù)及C++語言風格的函數(shù)。
全文摘要
本發(fā)明提供一種實現(xiàn)函數(shù)托管的方法,該方法通過在構(gòu)件化軟件系統(tǒng)中利用函數(shù)的托管函數(shù)將需要托管的函數(shù)托管給進程,在所托管的進程退出進入準備結(jié)束狀態(tài)時利用析構(gòu)函數(shù)調(diào)用并執(zhí)行被托管的函數(shù),提高了函數(shù)的托管效率,避免了函數(shù)的托管錯誤和程序結(jié)構(gòu)的破壞。本發(fā)明還提供一種實現(xiàn)函數(shù)托管的數(shù)據(jù)處理設(shè)備。
文檔編號G06F9/44GK101882067SQ20091005088
公開日2010年11月10日 申請日期2009年5月8日 優(yōu)先權(quán)日2009年5月8日
發(fā)明者宋世軍, 陳榕 申請人:上??铺┦兰o科技有限公司