- 相關(guān)推薦
COM服務(wù)器的偽異步技術(shù)及其實(shí)現
摘要:COM組件技術(shù)在Windows操作系統中發(fā)揮了極其重要的作用,但標準COM組件技術(shù)在實(shí)時(shí)操作性上不盡完善。作為補充可以用COM連接點(diǎn)技術(shù)和多線(xiàn)程技術(shù)來(lái)構造一種偽異步技術(shù), 完成某些前者不能完成的任務(wù)。本文詳細描述了其實(shí)現原理,并根據技術(shù)細節提供了作者的解決方案。
關(guān)鍵詞: COM;異步調用;連接點(diǎn);接口;STA; MTA
1. COM異步技術(shù)
與普通同步執行的COM服務(wù)器不同,一個(gè)提供異步方法調用的COM服務(wù)器允許客戶(hù)程序以一種非阻塞的方式來(lái)訪(fǎng)問(wèn)它,客戶(hù)程序可以在等待調用返回的過(guò)程中繼續進(jìn)行別的工作,從而提高工作效率。 尤其隨著(zhù)Windows2000和COM 的發(fā)布,COM現在已經(jīng)完全支持異步方法的調用了,通過(guò)IDL的定義,由MIDL編譯器為接口的每個(gè)方法實(shí)現同步和異步兩種獨立的調用定義。但是COM提供的這種異步方法調用并非盡善盡美:
1) 這種技術(shù)發(fā)布較晚,只在WIN2000下被支持,所以用它開(kāi)發(fā)的軟件不能在Windows 95和Windows NT平臺上運行。
2) 客戶(hù)端使用不便,盡管COM通過(guò)MIDL生成的接口代理(proxy)與存根(stub)完成了大部分為支持異步方法調用所做的工作,客戶(hù)端仍需要完成系列繁瑣的細節工作。
3) 無(wú)論客戶(hù)端還是服務(wù)器端都需要聚合由COM提供的對象,方法調用方式也有別于標準同步調用,因而不適用于標準ACTIVEX控件的編寫(xiě),而ACTIVEX控件實(shí)質(zhì)上是一種特殊的COM服務(wù)器。
由于上述一系列缺陷,往往需要一種替代解決辦法,通?梢杂靡恍┗镜腃OM技術(shù)來(lái)構造一種偽異步技術(shù)。
2. COM應用
這種偽異步技術(shù)是通過(guò)接口回調(interface callback)的方法來(lái)實(shí)現的,它基于兩項關(guān)鍵的COM技術(shù): 連接點(diǎn)(Connection point)技術(shù)和COM多線(xiàn)程(Multithread)技術(shù)。
連接點(diǎn)技術(shù)的基礎是COM的出接口(outgoing interface)。出接口與普通的接口不一樣,它由COM服務(wù)器端進(jìn)行定義,但卻由用戶(hù)程序來(lái)實(shí)現(此實(shí)現對象被稱(chēng)為接收器sink),并把接口指針告訴給COM服務(wù)器。由于出接口是在服務(wù)器的類(lèi)型庫中定義, 所以COM服務(wù)器可以很方便的利用此接口指針與客戶(hù)進(jìn)行通訊。但直接使用出接口,客戶(hù)程序和COM服務(wù)器都需要出接口有一定的了解,為此COM又提供了連接點(diǎn)技術(shù)(可連接對象),如圖:
COM提供的可連接對象,通過(guò)IConnectionPointContainer接口管理所有的出接口。對應于每個(gè)出接口,可連接對象管理一個(gè)連接點(diǎn)對象,每一個(gè)連接點(diǎn)對象實(shí)現了IConnectionPoint接口,客戶(hù)通過(guò)連接點(diǎn)對象建立接收器與可連接對象的連接,且通過(guò)兩個(gè)枚舉器的引入,使得可連接對象支持多個(gè)出接口,而每個(gè)出接口支持多個(gè)與接收器的連接。明顯,連接點(diǎn)技術(shù)的實(shí)質(zhì)是對出接口的一種封裝。通過(guò)使用連接點(diǎn)技術(shù),COM服務(wù)器可以用一種非常常規的方法描述它的引出接口,并為客戶(hù)程序提供了一種標準的方法來(lái)實(shí)現這些接口,對于實(shí)現服務(wù)器組件的標準化非常方便,也有利于客戶(hù)程序的獨立開(kāi)發(fā),符合中間件開(kāi)發(fā)的原則。
COM多線(xiàn)程管理相當復雜,要實(shí)現多線(xiàn)程,應對COM的線(xiàn)程模型有深入的了解。COM支持兩種線(xiàn)程模型:?jiǎn)尉(xiàn)程單元(STA,Single-Threaded Apartment)和多線(xiàn)程單元(MTA,MultiThreaded Apartment)。如圖所示:
單元是一種抽象的概念,定義了一組對象的邏輯集合,這些對象共享同一組并發(fā)性和重入限制,每個(gè)COM對象都只能屬于某一個(gè)單元。STA只能包含一個(gè)線(xiàn)程(單元線(xiàn)程),與32位Windows平臺上的用戶(hù)界面(UI)線(xiàn)程相似,單元線(xiàn)程擁有一個(gè)隱藏的窗口,所有對此線(xiàn)程中服務(wù)器組件方法的調用都被COM轉化為消息(message),通過(guò)消息循環(huán)進(jìn)行消息分發(fā),并調用窗口過(guò)程保證調用到COM對象的成員函數中;而每個(gè)MTA可以包含多個(gè)線(xiàn)程(自由線(xiàn)程),自由線(xiàn)程相似于Windows平臺的工作(Work)線(xiàn)程,不帶消息分發(fā),可以直接使用。每個(gè)進(jìn)程只能有一個(gè)MTA,但是可以于有任意多個(gè)STA,每一個(gè)使用COM的線(xiàn)程必須通過(guò)調用CoInitialize(0)來(lái)新建一個(gè)STA,或者通過(guò)調用CoInitializeEx(0,COINT_MULTITHREAD)來(lái)創(chuàng )建或加入一個(gè)MTA,否則這個(gè)線(xiàn)程將出錯。服務(wù)器組件實(shí)體存在于線(xiàn)程中,要么處于MTA中,要么處在STA中,別無(wú)選擇。遵守如下規則:跨單元的接口指針傳遞需要調度,否則指針無(wú)效。
3. 構造偽異步COM服務(wù)器
3.1偽異步COM服務(wù)器總體框架
偽異步調用的實(shí)質(zhì)是客戶(hù)程序將一個(gè)自己所實(shí)現的接收器指針傳遞到COM服務(wù)器,當服務(wù)器的接口受到客戶(hù)程序調用的時(shí)候將產(chǎn)生新的線(xiàn)程來(lái)實(shí)現功能任務(wù),而客戶(hù)程序的調用結束返回,新線(xiàn)程將在任務(wù)完成后通過(guò)傳入的接口指針回調到客戶(hù)程序,以通知客戶(hù)程序當前調用服務(wù)的消息和結果,從而在客戶(hù)程序和服務(wù)器之間產(chǎn)生一種對等關(guān)系。服務(wù)器和客戶(hù)程序異步協(xié)商過(guò)程如下:
1) COM實(shí)現一個(gè)服務(wù)器組件對象,它要么處在STA中,要么處在MTA中。
2) 客戶(hù)程序通過(guò)COM服務(wù)器的公開(kāi)接口查詢(xún)IConnectionPointContainer接口,客戶(hù)查詢(xún)成功就表明服務(wù)器支持連接點(diǎn)。
3) 查詢(xún)成功,客戶(hù)程序使用上面接口的FindConnectionPoint()方法來(lái)定位特定的出接口;或者用EnumConnectionPoints()方法枚舉所有連接點(diǎn),再進(jìn)行查詢(xún)定位。這樣客戶(hù)程序可以獲得一個(gè)IConnectionPoint接口,并通過(guò)它建立與服務(wù)器的連接。
4) 定位成功,則由客戶(hù)端實(shí)現這個(gè)出接口,這里的接口實(shí)現也即接收器(Sink)。
5) 客戶(hù)程序通過(guò)IConnectionPoint::Advise()方法將一個(gè)指向接收器的一個(gè)出接口指針傳遞給服務(wù)器。連接被建立。
6) COM服務(wù)器收到調用請求,創(chuàng )建新線(xiàn)程,并由新線(xiàn)程通過(guò)這個(gè)收到的出接口指針進(jìn)行回調(callback)操作,將通知或消息反饋到接收器,從而完成一次異步調用。
這是一種非常常規的方法,為客戶(hù)程序提供了一個(gè)標準的方法來(lái)實(shí)現這些接口,而且MFC(微軟基本類(lèi)庫)和ATL(活動(dòng)模板類(lèi)庫)都對連接點(diǎn)技術(shù)提供了很好的支持,使用方便。當然也能在服務(wù)器組件中直接使用出接口,從而省去出于標準化目的而對出接口進(jìn)行的封裝。這樣的好處是服務(wù)器組件直觀(guān)、高效,可以減少額外的開(kāi)銷(xiāo),但是它不能為客戶(hù)程序提供一個(gè)標準的方法來(lái)實(shí)現出接口,所以建議只在服務(wù)器和客戶(hù)端配合開(kāi)發(fā),雙方均了解出接口,且接口較為簡(jiǎn)單的情況下使用。
【COM服務(wù)器的偽異步技術(shù)及其實(shí)現】相關(guān)文章:
基于COM技術(shù)的公式計算組件的開(kāi)發(fā)與實(shí)現11-23
數字下變頻技術(shù)的研究及其FPGA實(shí)現03-07
雙目立體視覺(jué)技術(shù)的實(shí)現及其進(jìn)展03-18
郵件服務(wù)器設計與實(shí)現03-08
異步串行接口與以太網(wǎng)服務(wù)器的連接03-19
服務(wù)器集群技術(shù)及其在視頻網(wǎng)絡(luò )中的應用03-18
短信服務(wù)器的設計與實(shí)現03-08