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