專(zhuān)利名稱(chēng):基于構(gòu)件接口的異步調(diào)用方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種構(gòu)件化軟件系統(tǒng)中的調(diào)用方法,特別是關(guān)于一種構(gòu)件化軟件系統(tǒng)
中基于構(gòu)件接口的異步調(diào)用方法。
背景技術(shù):
異步調(diào)用是與同步調(diào)用相對(duì)的一種調(diào)用方式。如果是同步調(diào)用,調(diào)用方要等待調(diào) 用任務(wù)執(zhí)行完畢才返回。如果是調(diào)用異步,調(diào)用方會(huì)很快返回,但調(diào)用任務(wù)未必此時(shí)被執(zhí) 行,而是稍后某個(gè)時(shí)機(jī)才被執(zhí)行。通過(guò)異步調(diào)用,不需要等待調(diào)用任務(wù)完成就可以繼續(xù)執(zhí)行 其他任務(wù)。 當(dāng)調(diào)用執(zhí)行一些比較耗時(shí)的操作,例如磁盤(pán)讀寫(xiě)、網(wǎng)絡(luò)數(shù)據(jù)傳輸時(shí),通常會(huì)采用異 步調(diào)用方式。程序員創(chuàng)建一個(gè)工作線程用于等待磁盤(pán)讀寫(xiě)或網(wǎng)絡(luò)數(shù)據(jù)傳輸,以此來(lái)釋放 CPU,提高CPU的利用率。然而,在現(xiàn)有的技術(shù)中,異步調(diào)用的實(shí)現(xiàn)過(guò)程比較復(fù)雜。異步調(diào)用 的實(shí)現(xiàn)需要編寫(xiě)大量代碼,增加了重復(fù)勞動(dòng)。并且,利用多線程實(shí)現(xiàn)異步調(diào)用容易出現(xiàn)漏 洞,造成一定的安全隱患。這些問(wèn)題的存在,給構(gòu)件化軟件系統(tǒng)中實(shí)現(xiàn)異步調(diào)用帶來(lái)了很大 的限制。
發(fā)明內(nèi)容
鑒于以上內(nèi)容,有必要提供一種簡(jiǎn)便可靠的基于構(gòu)件接口的異步調(diào)用方法。
—種基于構(gòu)件接口的異步調(diào)用方法,適用于能運(yùn)行構(gòu)件化軟件系統(tǒng)的數(shù)據(jù)處理設(shè) 備,該方法包括步驟定義目標(biāo)構(gòu)件類(lèi)、該目標(biāo)構(gòu)件類(lèi)的異步接口及該異步接口的方法;創(chuàng) 建所述目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例;調(diào)用目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例的異步接口的方法;該調(diào)用進(jìn) 入目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例的夾壁墻,在目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例的夾壁墻里將調(diào)用信息打 包;向目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例投遞一個(gè)調(diào)用該異步接口方法的異步調(diào)用消息,然后直接返 回調(diào)用方;及根據(jù)所述異步調(diào)用消息執(zhí)行該異步接口方法。 本發(fā)明可以簡(jiǎn)化實(shí)現(xiàn)異步調(diào)用的代碼,減少由程序員實(shí)現(xiàn)多線程可能帶來(lái)隱患的 風(fēng)險(xiǎn)。對(duì)于構(gòu)件使用者,不必自己創(chuàng)建線程、管理線程,直接調(diào)用構(gòu)件的異步接口就可以實(shí) 現(xiàn)類(lèi)似的操作。對(duì)于構(gòu)件實(shí)現(xiàn)者,也同樣不必管理線程,只要聲明異步接口 ,該接口的實(shí)現(xiàn) 就會(huì)自動(dòng)以異步方式被調(diào)用。本發(fā)明簡(jiǎn)便可靠地實(shí)現(xiàn)了基于構(gòu)件接口的異步調(diào)用,給計(jì)算 機(jī)構(gòu)件化軟件系統(tǒng)的進(jìn)一步發(fā)展奠定了基礎(chǔ)。
圖1為本發(fā)明基于構(gòu)件接口的異步調(diào)用方法的流程圖。 圖2為消息隊(duì)列的循環(huán)處理流程。 圖3為基于構(gòu)件接口的異步調(diào)用的執(zhí)行情況示意圖。
具體實(shí)施例方式
本發(fā)明利用構(gòu)件化軟件系統(tǒng)的回調(diào)機(jī)制和構(gòu)件所特有的夾壁墻技術(shù)實(shí)現(xiàn)基于構(gòu)
件接口的異步調(diào)用。
在構(gòu)件化軟件系統(tǒng)中,已經(jīng)有了成熟的回調(diào)模型,這個(gè)模型就是A向B投遞一個(gè) 調(diào)用消息,投遞結(jié)束即返回;B的循環(huán)處理線程發(fā)現(xiàn)這個(gè)調(diào)用消息后會(huì)執(zhí)行相應(yīng)的操作。
此外,在構(gòu)件化軟件系統(tǒng)中,每個(gè)構(gòu)件都具有夾壁墻,所有對(duì)構(gòu)件方法的調(diào)用都會(huì) 先進(jìn)入夾壁墻。 當(dāng)同步調(diào)用某個(gè)方法時(shí),通過(guò)調(diào)用棧傳遞調(diào)用信息,該方法執(zhí)行完成返回調(diào)用方。 當(dāng)異步調(diào)用某個(gè)方法時(shí),會(huì)立即返回調(diào)用方,調(diào)用方也有可能就此結(jié)束返回。如果調(diào)用方調(diào) 用該方法時(shí)傳遞的參數(shù)位于調(diào)用方的棧上,當(dāng)調(diào)用方返回以后,調(diào)用方的棧會(huì)被釋放,如果 這時(shí)候所調(diào)用的方法被執(zhí)行,對(duì)所傳遞的參數(shù)的訪問(wèn)就會(huì)成為非法訪問(wèn),所訪問(wèn)的參數(shù)就 會(huì)成為無(wú)效參數(shù)。 為了解決這個(gè)問(wèn)題,在夾壁墻里將調(diào)用參數(shù)等調(diào)用信息打包起來(lái),并且保存在一 塊堆內(nèi)存上。這樣,調(diào)用方的調(diào)用參數(shù)已經(jīng)被拷貝了一份,即便調(diào)用方返回退出也不會(huì)影響 所調(diào)用的方法的運(yùn)行。 結(jié)合回調(diào)機(jī)制和夾壁墻技術(shù),在本發(fā)明中,當(dāng)調(diào)用目標(biāo)構(gòu)件異步接口所實(shí)現(xiàn)的方 法時(shí),在目標(biāo)構(gòu)件的夾壁墻里將調(diào)用信息進(jìn)行打包,利用回調(diào)機(jī)制向目標(biāo)構(gòu)件投遞一個(gè)異 步調(diào)用消息,然后直接返回調(diào)用方,被調(diào)用的異步接口所實(shí)現(xiàn)的方法將會(huì)在調(diào)用返回后的 某個(gè)不能預(yù)期的時(shí)機(jī)被執(zhí)行,由此實(shí)現(xiàn)基于構(gòu)件接口的異步調(diào)用。 參閱圖1所示,是構(gòu)件化軟件系統(tǒng)中基于構(gòu)件接口的異步調(diào)用方法的流程圖。該 方法適用于能運(yùn)行構(gòu)件化軟件系統(tǒng)的數(shù)據(jù)處理設(shè)備。所述數(shù)據(jù)處理設(shè)備可以是手機(jī)、數(shù)碼 相機(jī)、個(gè)人數(shù)字助理(Personal DigitalAssistant,PDA)等電子設(shè)備。在本實(shí)施例中,所述 構(gòu)件化軟件系統(tǒng)是嵌入式操作系統(tǒng)。 步驟S100,定義目標(biāo)構(gòu)件類(lèi)、該目標(biāo)構(gòu)件類(lèi)的異步接口及該異步接口的方法。例 如,定義目標(biāo)構(gòu)件類(lèi)CFile,該目標(biāo)構(gòu)件類(lèi)CFile的異步接口 IFile,該異步接口 IFile的 Write方法。 步驟S102,創(chuàng)建所述目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例(即目標(biāo)構(gòu)件)。例如,通過(guò)目標(biāo)構(gòu)件 類(lèi)CFile的對(duì)象指針pFile創(chuàng)建目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例。 步驟S104,調(diào)用目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例的異步接口的方法。例如,通過(guò)目標(biāo)構(gòu)件類(lèi) CFile的對(duì)象指針pFile調(diào)用Write方法。 步驟S106,該調(diào)用進(jìn)入目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例的夾壁墻,在目標(biāo)構(gòu)件類(lèi)的對(duì)象 實(shí)例的夾壁墻里將調(diào)用信息打包。例如,上面例子中的CFile: :Write方法進(jìn)入夾壁墻 CFile: :—Write方法里,在CFile: :—Write方法里將該調(diào)用的調(diào)用參數(shù)及被調(diào)用的接口 方法等調(diào)用信息進(jìn)行打包。 步驟S10S,向目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例投遞一個(gè)調(diào)用該異步接口方法的異步調(diào)用消 息,然后直接返回調(diào)用方。例如,在本實(shí)施例中,利用回調(diào)機(jī)制向目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例投 遞一個(gè)調(diào)用Write方法的異步調(diào)用消息,然后直接返回調(diào)用方。 可以用下面的一段程序代碼實(shí)現(xiàn)本實(shí)施例中目標(biāo)構(gòu)件類(lèi)CFile的夾壁墻的功能
CFile: :—Write (WString謹(jǐn)e, MemoryBuf*buffer) 〃夾壁墻函數(shù)
{ ret證PostCallbackEvent (MAKE_PARAMETER(name, buffer, &CFile: :Write));〃將調(diào)用參數(shù)打包,并將異步調(diào)用消息投遞到消息隊(duì)列 } ECode PostCallbackEvent (par咖) { return queue. InsertFirst (param);〃將調(diào)用請(qǐng)求放入消息隊(duì)列 } 步驟S110,根據(jù)所述異步調(diào)用消息,在調(diào)用返回后的某個(gè)時(shí)機(jī)執(zhí)行該異步接口方 法。在本實(shí)施例中,所有構(gòu)件都運(yùn)行于某個(gè)Applet,這個(gè)Applet帶有一個(gè)消息隊(duì)列及循環(huán) 處理線程,所述異步調(diào)用消息將被投遞到目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例所屬的Applet的消息隊(duì) 列中等待處理。循環(huán)處理線程會(huì)按順序逐個(gè)處理在消息隊(duì)列中等待的調(diào)用消息,例如所述 異步調(diào)用消息,直到消息隊(duì)列為空。從而,所述異步接口方法會(huì)在調(diào)用返回后的某個(gè)時(shí)機(jī)被 執(zhí)行。例如,如圖2所示的消息隊(duì)列的循環(huán)處理流程,該消息隊(duì)列的循環(huán)處理流程包括步 驟S200,接收一個(gè)調(diào)用消息,例如異步調(diào)用消息;及步驟S202,根據(jù)該調(diào)用消息解析相應(yīng)的 調(diào)用信息,并調(diào)用相應(yīng)的接口方法。 步驟S112,在異步接口方法執(zhí)行完畢后返回執(zhí)行結(jié)果。雖然調(diào)用方對(duì)目標(biāo)構(gòu)件接 口的調(diào)用是異步的,對(duì)調(diào)用方來(lái)說(shuō)可能不知道該調(diào)用何時(shí)被執(zhí)行,何時(shí)被執(zhí)行完,但是可以 利用回調(diào)機(jī)制獲取執(zhí)行的結(jié)果。在本實(shí)施例中,CFile提供一個(gè)回調(diào)接口 IFileEvents,當(dāng) Write方法執(zhí)行完成時(shí),激發(fā)Completed事件,回調(diào)回調(diào)函數(shù)OnCompleted。在調(diào)用Write 方法之前需要注冊(cè)Completed事件,將回調(diào)函數(shù)OnCompleted與Completed事件相關(guān)聯(lián)。
例如,利用下面的代碼進(jìn)行注冊(cè),將用戶定義的回調(diào)函數(shù)OnCompleted與 Completed事件相關(guān)聯(lián) CFile: :AddCompletedCallback(pFile, &0nCompleted); 其中,CFile表示要注冊(cè)哪個(gè)構(gòu)件類(lèi)的事件,函數(shù)名中的Add表示注冊(cè)操作,函數(shù) 名中的Completed表示注冊(cè)哪個(gè)事件,函數(shù)的第一個(gè)參數(shù)pFile是一個(gè)CFile構(gòu)件類(lèi)的對(duì) 象指針,函數(shù)的第二個(gè)參數(shù)OnCompleted是一個(gè)由用戶定義的回調(diào)函數(shù),當(dāng)事件發(fā)生時(shí)這 個(gè)函數(shù)會(huì)被調(diào)用。 可以根據(jù)需要定義回調(diào)函數(shù),例如,定義如下的回調(diào)函數(shù)
OnCompleted : ECode OnCompleted(PVoid pUserData,PInterface pSender, Int32 nWrittenBytes)
{ WStringBuf—〈256〉out ; out《L "Has written"《nWrittenBytes《"Bytes. \n,,; out《L "Current time is"《time (0); CConsole::WriteLine(out); Return N0ERR0R ; }
5
在上述回調(diào)函數(shù)OnCompleted中,輸出實(shí)際寫(xiě)入的字節(jié)數(shù)及異步調(diào)用執(zhí)行完成時(shí) 的系統(tǒng)時(shí)間。因而,當(dāng)Write方法執(zhí)行完畢時(shí),可以通過(guò)回調(diào)函數(shù)OnCompleted輸出實(shí)際寫(xiě) 入的字節(jié)數(shù)及異步調(diào)用執(zhí)行完成時(shí)的系統(tǒng)時(shí)間。 參閱圖3所示,是基于構(gòu)件接口的異步調(diào)用的執(zhí)行情況示意圖。在本實(shí)施例中, 分別輸出異步調(diào)用前的系統(tǒng)時(shí)間、異步調(diào)用返回的系統(tǒng)時(shí)間、實(shí)際寫(xiě)入的字節(jié)數(shù)以及調(diào) 用執(zhí)行完成時(shí)的系統(tǒng)時(shí)間。如圖所示,異步調(diào)用返回的系統(tǒng)時(shí)間與異步調(diào)用前的系統(tǒng)時(shí) 間均為1213924589 ,實(shí)際寫(xiě)入的字節(jié)數(shù)是1048576字節(jié),調(diào)用執(zhí)行完成時(shí)的系統(tǒng)時(shí)間是 1213924624。由此可見(jiàn),利用上述基于構(gòu)件接口的異步調(diào)用方法能夠成功實(shí)現(xiàn)異步調(diào)用,調(diào) 用方直接返回,被調(diào)用的方法在稍后的某個(gè)時(shí)機(jī)被執(zhí)行。 下面通過(guò)幾段代碼來(lái)說(shuō)明基于構(gòu)件接口的異步調(diào)用的實(shí)現(xiàn)方法。在下面所述的
幾段代碼中,目標(biāo)構(gòu)件類(lèi)是CFile,該目標(biāo)構(gòu)件類(lèi)CFile實(shí)現(xiàn)異步接口 IFile,該異步接口
IFile實(shí)現(xiàn)Write方法。
(l)File. car〃構(gòu)件定義文件 Interface IFile {〃定義構(gòu)件的接口 Write(WString謹(jǐn)e, MemoryBuf buffer);〃聲明接口方法
} Interface IFileEvents {〃定義構(gòu)件的接口 Completed(Int32writtenBytes);〃聲明接口方法 } Class CFile {〃定義一個(gè)構(gòu)件類(lèi) asynchronous interface IFile ;//聲明該構(gòu)^牛類(lèi)實(shí)I見(jiàn)IFile異步接口
callback interface IFileEvents ;
〃聲明該構(gòu)件類(lèi)具有IFileEvents回調(diào)接口
} (2)File.c卯 〃Write方法定義文件CFile::Write(WString name, MemoryBuf氺buffer) { WStringBuf_〈256>out ;
out《L "Begin writing"《time (0);
CConsole::WriteLine(out);
FILE*fp = _wfopen (name, "w");
...... fwrite (buffer_>GetPlayload () , 1 , buffer_>GetLength () , fp);
Callback::Completed(nWritten); ...... } (3)Client.cpp 〃基于構(gòu)件接口的異步調(diào)用的客戶端程序 ECode 0nCompleted(PVoid pUserData,PInterface pSender, Int32 nWrittenBytes)〃定義回調(diào)函數(shù)
{ WStringBuf—〈256〉out ; out《L "Has written"《nWrittenBytes《"Bytes. \n,,; out《L "Current time is"《time (0); CConsole::WriteLine(out); Return N0ERR0R ; } ECode ElastosMain (const BufferOf〈WString>&wargs) 〃主程序 { IFile*pFile ; MemoryBuf_〈1048576>buffer ;〃1MB WStringBuf_〈64>out ; ...... CFile: :AddCompletedCallback(pFile, &0nCompleted);〃注冊(cè)
Completed事件 Time_t begTime = time(O); pFIle_>Write (L "user, dat", &buffer);〃寫(xiě)1MB數(shù)據(jù)至lj "user, dat Time_t endTime = time(O); out《L "Begin time"《begTime《"\n"; out《L "End time"《endTime ; CConsole::WriteLine(out); ...... Return N0ERR0R ; } 根據(jù)本發(fā)明,如果構(gòu)件在實(shí)現(xiàn)某個(gè)接口時(shí)包含了比較耗時(shí)的操作,可以將該接口 聲明為異步接口。當(dāng)該接口的方法被調(diào)用時(shí),調(diào)用方能夠很快地返回,繼續(xù)后面的操作。
權(quán)利要求
一種基于構(gòu)件接口的異步調(diào)用方法,適用于能運(yùn)行構(gòu)件化軟件系統(tǒng)的數(shù)據(jù)處理設(shè)備,其特征在于,該方法包括步驟定義目標(biāo)構(gòu)件類(lèi)、該目標(biāo)構(gòu)件類(lèi)的異步接口及該異步接口的方法;創(chuàng)建所述目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例;調(diào)用目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例的異步接口的方法;該調(diào)用進(jìn)入目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例的夾壁墻,在目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例的夾壁墻里將調(diào)用信息打包;向目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例投遞一個(gè)調(diào)用該異步接口方法的異步調(diào)用消息,然后直接返回調(diào)用方;及根據(jù)所述異步調(diào)用消息執(zhí)行該異步接口方法。
2. 如權(quán)利要求1所述的基于構(gòu)件接口的異步調(diào)用方法,其特征在于,所述構(gòu)件化軟件 系統(tǒng)是嵌入式操作系統(tǒng)。
3. 如權(quán)利要求1所述的基于構(gòu)件接口的異步調(diào)用方法,其特征在于,所述數(shù)據(jù)處理設(shè) 備包括手機(jī)、數(shù)碼相機(jī)及個(gè)人數(shù)字助理。
4. 如權(quán)利要求1所述的基于構(gòu)件接口的異步調(diào)用方法,其特征在于,該方法還包括 在異步接口方法執(zhí)行完畢后返回執(zhí)行結(jié)果。
5. 如權(quán)利要求4所述的基于構(gòu)件接口的異步調(diào)用方法,其特征在于,所述在異步接口 方法執(zhí)行完畢后返回執(zhí)行結(jié)果是利用回調(diào)機(jī)制返回所述執(zhí)行結(jié)果。
6. 如權(quán)利要求1所述的基于構(gòu)件接口的異步調(diào)用方法,其特征在于,所述向目標(biāo)構(gòu)件 類(lèi)的對(duì)象實(shí)例投遞一個(gè)調(diào)用該異步接口方法的異步調(diào)用消息是利用回調(diào)機(jī)制投遞所述異 步調(diào)用消息。
7. 如權(quán)利要求1所述的基于構(gòu)件接口的異步調(diào)用方法,其特征在于,所述向目標(biāo)構(gòu)件 類(lèi)的對(duì)象實(shí)例投遞一個(gè)調(diào)用該異步接口方法的異步調(diào)用消息的步驟中,該異步調(diào)用消息被 投遞到目標(biāo)構(gòu)件類(lèi)的對(duì)象實(shí)例所屬的消息隊(duì)列中。
8. 如權(quán)利要求7所述的基于構(gòu)件接口的異步調(diào)用方法,其特征在于,所述消息隊(duì)列由 循環(huán)處理線程順序處理。
全文摘要
本發(fā)明提供一種基于構(gòu)件接口的異步調(diào)用方法。該方法在目標(biāo)構(gòu)件的夾壁墻里將調(diào)用信息打包,向目標(biāo)構(gòu)件投遞一個(gè)異步調(diào)用消息,然后直接返回調(diào)用方。根據(jù)異步調(diào)用消息,被調(diào)用的異步接口方法在調(diào)用返回后的某個(gè)時(shí)機(jī)被執(zhí)行。本發(fā)明能夠簡(jiǎn)便可靠地實(shí)現(xiàn)基于構(gòu)件接口的異步調(diào)用。
文檔編號(hào)G06F9/46GK101770394SQ20081020805
公開(kāi)日2010年7月7日 申請(qǐng)日期2008年12月29日 優(yōu)先權(quán)日2008年12月29日
發(fā)明者宋世軍, 陳榕 申請(qǐng)人:上海科泰世紀(jì)科技有限公司