999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

淺談COM服務器的偽異步技術

2008-04-12 00:00:00劉春楊
中國新技術新產品 2008年23期

摘要:COM組件技術在Windows操作系統中發揮了極其重要的作用,但標準COM組件技術在實時操作性上不盡完善。作為補充可以用COM連接點技術和多線程技術來構造一種偽異步技術, 完成某些前者不能完成的任務。本文詳細描述了其實現原理,并根據技術細節提供了解決方案。

關鍵詞:COM;異步技術;偽異步技術

1COM異步技術

與普通同步執行的COM服務器不同,一個提供異步方法調用的COM服務器允許客戶程序以一種非阻塞的方式來訪問它,客戶程序可以在等待調用返回的過程中繼續進行別的工作,從而提高工作效率。 尤其隨著Windows2000和COM+的發布,COM現在已經完全支持異步方法的調用了,通過IDL的定義,由MIDL編譯器為接口的每個方法實現同步和異步兩種獨立的調用定義。但是COM提供的這種異步方法調用并非盡善盡美:

這種技術發布較晚,只在WIN2000下被支持,所以用它開發的軟件不能在Windows 95和Windows NT平臺上運行。

客戶端使用不便,盡管COM通過MIDL生成的接口代理(proxy)與存根(stub)完成了大部分為支持異步方法調用所做的工作,客戶端仍需要完成系列繁瑣的細節工作。

無論客戶端還是服務器端都需要聚合由COM提供的對象,方法調用方式也有別于標準同步調用,因而不適用于標準ACTIVEX控件的編寫,而ACTIVEX控件實質上是一種特殊的COM服務器。

由于上述一系列缺陷,往往需要一種替代解決辦法,通常可以用一些基本的COM技術來構造一種偽異步技術。

2 構造偽異步COM服務器

2.1 偽異步COM服務器總體框架

偽異步調用的實質是客戶程序將一個自己所實現的接收器指針傳遞到COM服務器,當服務器的接口受到客戶程序調用的時候將產生新的線程來實現功能任務,而客戶程序的調用結束返回,新線程將在任務完成后通過傳入的接口指針回調到客戶程序,以通知客戶程序當前調用服務的消息和結果,從而在客戶程序和服務器之間產生一種對等關系。服務器和客戶程序異步協商過程如下:

COM實現一個服務器組件對象,它要么處在STA中,要么處在MTA中。

客戶程序通過COM服務器的公開接口查詢IConnectionPointContainer接口,客戶查詢成功就表明服務器支持連接點。

查詢成功,客戶程序使用上面接口的FindConnectionPoint()方法來定位特定的出接口;或者用EnumConnectionPoints()方法枚舉所有連接點,再進行查詢定位。這樣客戶程序可以獲得一個IConnectionPoint接口,并通過它建立與服務器的連接。

定位成功,則由客戶端實現這個出接口,這里的接口實現也即接收器(Sink)。

客戶程序通過IConnectionPoint::Advise()方法將一個指向接收器的一個出接口指針傳遞給服務器。連接被建立。

COM服務器收到調用請求,創建新線程,并由新線程通過這個收到的出接口指針進行回調(callback)操作,將通知或消息反饋到接收器,從而完成一次異步調用。

這是一種非常常規的方法,為客戶程序提供了一個標準的方法來實現這些接口,而且MFC(微軟基本類庫)和ATL(活動模板類庫)都對連接點技術提供了很好的支持,使用方便。當然也能在服務器組件中直接使用出接口,從而省去出于標準化目的而對出接口進行的封裝。這樣的好處是服務器組件直觀、高效,可以減少額外的開銷,但是它不能為客戶程序提供一個標準的方法來實現出接口,所以建議只在服務器和客戶端配合開發,雙方均了解出接口,且接口較為簡單的情況下使用。

2.2 MTA中的COM服務器

如果COM服務器組件處在一個多線程單元(MTA)里面的,要實現異步回調非常容易,只要新生成的線程通過CoInitializeEx(0,COINT_MULTITHREAD)也加入了同一個MTA,那么COM服務器就可以簡單地將接收器傳入的出接口指針傳遞給這個新線程,新線程可以使用這個指針直接進行回調操作。原因很簡單,出接口的指針傳遞并沒有跨單元。如果新生成的線程通過CoInitialize (0)創建了一個新的STA,我們也可以作同樣處理。在此情況下,跨單元的接口指針傳遞的確需要進行調度,但是COM相當聰明,在此情況下它能自動完成指針的調度。當然了,調度必然影響組件的效率,不管我們是手動調度或者是COM進行的自動調度。在服務器的開發中引入MTA,通常是為了追求高效率,提供組件對并行性的支持。相應的,必須對服務器對象的成員函數進行同步處理,保證多個線程調用不會發生沖突,也就是說服務器組件必須是在各方面都是線程安全的,全局數據也必須要受到保護。

2.3 STA中的COM服務器

COM服務器組件如果被建立在一個單線程單元(STA)里面的,情況就不同了,因為STA中只存在一個線程, 要實現異步回調,必然要涉及到出接口指針的跨單元使用。通常有兩種解決方案:

由COM服務器組件把出接口指針調度到新的線程中去,這個過程在通常情況下是由服務器組件的開發人員手工進行調度, COM提供了兩個標準的函數,服務器組件使用函數CoMarshallInterThreadInterfaceInStream(IID_ICallBack,m_pCallBack,pStream)將出接口指針調度到一個流(stream)中去,而在需要執行回調的新線程里使用COM所提供的CoGetInterfaceAndReleaseStream(pStream,IID_ICallBack, (void **)pCallBack)函數將流里的出接口指針pCallBack取出來。通過這個調度過程,COM為指針在兩端建立了代理和存根,我們就可以在新線程里直接使用這個指針進行回調操作了。這是一個普遍的用法, 但是指針的調度是一個開銷很大的過程,所以它的效率不高。

我們還可以采用另外一種替代方法:新線程向服務器所在線程發送的窗口消息,由COM服務器組件實現回調函數(使用出接口指針)來響應這個消息。這個過程主要是利用消息循環,讓STA中的窗口過程保證調用到COM對象相應的回調函數中去, 新線程可以避免對出接口指針的直接操作。由于避免了指針的跨單元傳遞,我們就可以節省跨單元調度所需要的開銷,效率非常高。在很多時候這甚至是唯一的方法,在ATL(活動模板庫)中使用連接點技術非常方便,因為ATL通過連接點向導為回調提供了一個連接代理,對回調過程進行了很好的封裝。但是出接口指針被完全封裝到了觸發(fire)函數中,要跨單元傳遞出接口指針就非常困難,所以通過消息來觸發回調就成了最好的選擇。但是應強調一點,STA里線程必須要實現自己的消息循環機制,能夠分發消息,否則對STA中組件方法的任何調用都將被掛起(hang)。所以用MFC來實現一個存在于STA中的COM服務器是一個很壞的選擇,因為MFC中STA的線程(類似于工作線程)是不具有消息循環的。

采用STA開發COM服務器雖然復雜,但優點明顯。STA中的單元線程擁有隱藏的窗口,所有對此線程中服務器組件方法的調用都被COM轉化為消息(message),由窗口過程保證調用到COM對象的成員函數中。由于消息總按照一定順序執行,所以不需要進行同步處理,這也是STA模型的最大優點----由COM來處理多數線程同步方面的細節問題。如果并不太關心并行性,而更看重組件的功能,那么就可以引入單線程單元(STA)來設計服務器組件。

結論

要實現一個偽異步工作的COM服務器,必須對連接點技術和COM線程模型進行合理的組合使用,尤其線程模型的選擇更是我們實現高效COM服務器的關鍵。此外,推薦使用ATL來開發這樣一個服務器組件,因為它靈活,高效,對COM的各項技術均提供了極好的支持,尤其在對COM線程模型的支持方面,是MFC所不能比擬的。

參考文獻

[1]潘愛民,COM原理與應用[M] ,北京:清華大學出版社

[3]Martin Gudgin(著)宋亞男(譯),IDL精髓[M] ,北京:中國電力出版社

主站蜘蛛池模板: 久久综合丝袜长腿丝袜| 日韩在线影院| 欧美伦理一区| 亚洲系列中文字幕一区二区| 国产SUV精品一区二区6| 久久精品丝袜高跟鞋| 又爽又大又光又色的午夜视频| 99久久性生片| 色一情一乱一伦一区二区三区小说| 国产精品深爱在线| 色香蕉影院| 99视频在线免费看| 19国产精品麻豆免费观看| 人妻丰满熟妇AV无码区| 麻豆国产原创视频在线播放| 视频国产精品丝袜第一页| 最新亚洲人成网站在线观看| 亚洲欧美成aⅴ人在线观看 | 性做久久久久久久免费看| 国产亚洲欧美在线中文bt天堂| 日韩精品无码免费专网站| 欧美日韩理论| 亚洲婷婷在线视频| 人妻夜夜爽天天爽| 久久中文字幕av不卡一区二区| 中文字幕乱码中文乱码51精品| 色综合天天操| 国产精品永久在线| 国产亚洲美日韩AV中文字幕无码成人 | 免费观看国产小粉嫩喷水| 久久久久青草线综合超碰| 97se亚洲综合在线天天| 97成人在线视频| 亚洲大尺码专区影院| 国产女人在线| 国模视频一区二区| 日本不卡在线| 亚洲综合色在线| 久久精品无码国产一区二区三区| 欧美日韩另类在线| 99一级毛片| 2024av在线无码中文最新| 亚洲无码高清视频在线观看| 激情成人综合网| 日韩精品成人网页视频在线 | 美女无遮挡免费视频网站| 欧美高清三区| 四虎永久在线精品影院| 91精品国产一区自在线拍| 91无码人妻精品一区| 久久这里只精品国产99热8| 欧美在线国产| 亚洲一区波多野结衣二区三区| 免费看av在线网站网址| 日韩福利视频导航| 欧美亚洲国产一区| 无码网站免费观看| 无码电影在线观看| 岛国精品一区免费视频在线观看| 亚洲小视频网站| 日韩高清成人| 人妖无码第一页| 国产精品尤物在线| 久久中文电影| 久久久久青草线综合超碰| 欧美一道本| 国产黄网站在线观看| 亚洲第一网站男人都懂| 欧美日本在线观看| 免费不卡视频| 亚洲精品无码AⅤ片青青在线观看| 嫩草影院在线观看精品视频| 欧洲高清无码在线| 人妻无码一区二区视频| 久久99蜜桃精品久久久久小说| 国产成人一区| 99精品福利视频| 99在线视频免费| 国产精品久久久精品三级| 精品久久香蕉国产线看观看gif| 日本三级黄在线观看| 久青草免费在线视频|