第一页欧美-第一页综合-丁香花成人另类小说-丁香久久-顶级欧美色妇xxxxbbbb

學(xué)術(shù)咨詢

讓期刊論文更省時(shí)、省事、省心

職稱論文發(fā)表之實(shí)現(xiàn)COM服務(wù)器的偽異步技術(shù)

時(shí)間:2014年12月03日 分類:推薦論文 次數(shù):

COM組件技術(shù)在Windows操作系統(tǒng)中發(fā)揮了極其重要的作用,但標(biāo)準(zhǔn)COM組件技術(shù)在實(shí)時(shí)操作性上不盡完善。作為補(bǔ)充可以用COM連接點(diǎn)技術(shù)和多線程技術(shù)來構(gòu)造一種偽異步技術(shù), 完成某些前者不能完成的任務(wù)。本文詳細(xì)描述了其實(shí)現(xiàn)原理,并根據(jù)技術(shù)細(xì)節(jié)提供了作者的解決

  摘要:COM組件技術(shù)在Windows操作系統(tǒng)中發(fā)揮了極其重要的作用,但標(biāo)準(zhǔn)COM組件技術(shù)在實(shí)時(shí)操作性上不盡完善。作為補(bǔ)充可以用COM連接點(diǎn)技術(shù)和多線程技術(shù)來構(gòu)造一種偽異步技術(shù), 完成某些前者不能完成的任務(wù)。本文詳細(xì)描述了其實(shí)現(xiàn)原理,并根據(jù)技術(shù)細(xì)節(jié)提供了作者的解決方案。

  關(guān)鍵詞:職稱論文發(fā)表,COM,異步調(diào)用,連接點(diǎn),接口,STA,MTA

  1. COM異步技術(shù)

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

  1) 這種技術(shù)發(fā)布較晚,只在WIN2000下被支持,所以用它開發(fā)的軟件不能在Windows 95和Windows NT平臺(tái)上運(yùn)行。

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

  3) 無論客戶端還是服務(wù)器端都需要聚合由COM提供的對(duì)象,方法調(diào)用方式也有別于標(biāo)準(zhǔn)同步調(diào)用,因而不適用于標(biāo)準(zhǔn)ACTIVEX控件的編寫,而ACTIVEX控件實(shí)質(zhì)上是一種特殊的COM服務(wù)器。

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

  2. COM應(yīng)用

  這種偽異步技術(shù)是通過接口回調(diào)(interface callback)的方法來實(shí)現(xiàn)的,它基于兩項(xiàng)關(guān)鍵的COM技術(shù): 連接點(diǎn)(Connection point)技術(shù)和COM多線程(Multithread)技術(shù)。

  連接點(diǎn)技術(shù)的基礎(chǔ)是COM的出接口(outgoing interface)。出接口與普通的接口不一樣,它由COM服務(wù)器端進(jìn)行定義,但卻由用戶程序來實(shí)現(xiàn)(此實(shí)現(xiàn)對(duì)象被稱為接收器sink),并把接口指針告訴給COM服務(wù)器。由于出接口是在服務(wù)器的類型庫中定義, 所以COM服務(wù)器可以很方便的利用此接口指針與客戶進(jìn)行通訊。但直接使用出接口,客戶程序和COM服務(wù)器都需要出接口有一定的了解,為此COM又提供了連接點(diǎn)技術(shù)(可連接對(duì)象),如圖:

  COM提供的可連接對(duì)象,通過IConnectionPointContainer接口管理所有的出接口。對(duì)應(yīng)于每個(gè)出接口,可連接對(duì)象管理一個(gè)連接點(diǎn)對(duì)象,每一個(gè)連接點(diǎn)對(duì)象實(shí)現(xiàn)了IConnectionPoint接口,客戶通過連接點(diǎn)對(duì)象建立接收器與可連接對(duì)象的連接,且通過兩個(gè)枚舉器的引入,使得可連接對(duì)象支持多個(gè)出接口,而每個(gè)出接口支持多個(gè)與接收器的連接。明顯,連接點(diǎn)技術(shù)的實(shí)質(zhì)是對(duì)出接口的一種封裝。通過使用連接點(diǎn)技術(shù),COM服務(wù)器可以用一種非常常規(guī)的方法描述它的引出接口,并為客戶程序提供了一種標(biāo)準(zhǔn)的方法來實(shí)現(xiàn)這些接口,對(duì)于實(shí)現(xiàn)服務(wù)器組件的標(biāo)準(zhǔn)化非常方便,也有利于客戶程序的獨(dú)立開發(fā),符合中間件開發(fā)的原則。

  COM多線程管理相當(dāng)復(fù)雜,要實(shí)現(xiàn)多線程,應(yīng)對(duì)COM的線程模型有深入的了解。COM支持兩種線程模型:?jiǎn)尉程單元(STA,Single-Threaded Apartment)和多線程單元(MTA,MultiThreaded Apartment)。如圖所示:

  單元是一種抽象的概念,定義了一組對(duì)象的邏輯集合,這些對(duì)象共享同一組并發(fā)性和重入限制,每個(gè)COM對(duì)象都只能屬于某一個(gè)單元。STA只能包含一個(gè)線程(單元線程),與32位Windows平臺(tái)上的用戶界面(UI)線程相似,單元線程擁有一個(gè)隱藏的窗口,所有對(duì)此線程中服務(wù)器組件方法的調(diào)用都被COM轉(zhuǎn)化為消息(message),通過消息循環(huán)進(jìn)行消息分發(fā),并調(diào)用窗口過程保證調(diào)用到COM對(duì)象的成員函數(shù)中;而每個(gè)MTA可以包含多個(gè)線程(自由線程),自由線程相似于Windows平臺(tái)的工作(Work)線程,不帶消息分發(fā),可以直接使用。每個(gè)進(jìn)程只能有一個(gè)MTA,但是可以于有任意多個(gè)STA,每一個(gè)使用COM的線程必須通過調(diào)用CoInitialize(0)來新建一個(gè)STA,或者通過調(diào)用CoInitializeEx(0,COINT_MULTITHREAD)來創(chuàng)建或加入一個(gè)MTA,否則這個(gè)線程將出錯(cuò)。服務(wù)器組件實(shí)體存在于線程中,要么處于MTA中,要么處在STA中,別無選擇。遵守如下規(guī)則:跨單元的接口指針傳遞需要調(diào)度,否則指針無效。

  3. 構(gòu)造偽異步COM服務(wù)器

  3.1偽異步COM服務(wù)器總體框架

  偽異步調(diào)用的實(shí)質(zhì)是客戶程序?qū)⒁粋(gè)自己所實(shí)現(xiàn)的接收器指針傳遞到COM服務(wù)器,當(dāng)服務(wù)器的接口受到客戶程序調(diào)用的時(shí)候?qū)a(chǎn)生新的線程來實(shí)現(xiàn)功能任務(wù),而客戶程序的調(diào)用結(jié)束返回,新線程將在任務(wù)完成后通過傳入的接口指針回調(diào)到客戶程序,以通知客戶程序當(dāng)前調(diào)用服務(wù)的消息和結(jié)果,從而在客戶程序和服務(wù)器之間產(chǎn)生一種對(duì)等關(guān)系。服務(wù)器和客戶程序異步協(xié)商過程如下:

  1) COM實(shí)現(xiàn)一個(gè)服務(wù)器組件對(duì)象,它要么處在STA中,要么處在MTA中。

  2) 客戶程序通過COM服務(wù)器的公開接口查詢IConnectionPointContainer接口,客戶查詢成功就表明服務(wù)器支持連接點(diǎn)。

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

  4) 定位成功,則由客戶端實(shí)現(xiàn)這個(gè)出接口,這里的接口實(shí)現(xiàn)也即接收器(Sink)。

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

  6) COM服務(wù)器收到調(diào)用請(qǐng)求,創(chuàng)建新線程,并由新線程通過這個(gè)收到的出接口指針進(jìn)行回調(diào)(callback)操作,將通知或消息反饋到接收器,從而完成一次異步調(diào)用。

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

  3.2 MTA中的COM服務(wù)器

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

  3.3 STA中的COM服務(wù)器

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

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

  (2)我們還可以采用另外一種替代方法:新線程向服務(wù)器所在線程發(fā)送的窗口消息,由COM服務(wù)器組件實(shí)現(xiàn)回調(diào)函數(shù)(使用出接口指針)來響應(yīng)這個(gè)消息。這個(gè)過程主要是利用消息循環(huán),讓STA中的窗口過程保證調(diào)用到COM對(duì)象相應(yīng)的回調(diào)函數(shù)中去, 新線程可以避免對(duì)出接口指針的直接操作。由于避免了指針的跨單元傳遞,我們就可以節(jié)省跨單元調(diào)度所需要的開銷,效率非常高。在很多時(shí)候這甚至是唯一的方法,在ATL(活動(dòng)模板庫)中使用連接點(diǎn)技術(shù)非常方便,因?yàn)锳TL通過連接點(diǎn)向?qū)榛卣{(diào)提供了一個(gè)連接辦理,對(duì)回調(diào)過程進(jìn)行了很好的封裝。但是出接口指針被完全封裝到了觸發(fā)(fire)函數(shù)中,要跨單元傳遞出接口指針就非常困難,所以通過消息來觸發(fā)回調(diào)就成了最好的選擇。但是應(yīng)強(qiáng)調(diào)一點(diǎn),STA里線程必須要實(shí)現(xiàn)自己的消息循環(huán)機(jī)制,能夠分發(fā)消息,否則對(duì)STA中組件方法的任何調(diào)用都將被掛起(hang)。所以用MFC來實(shí)現(xiàn)一個(gè)存在于STA中的COM服務(wù)器是一個(gè)很壞的選擇,因?yàn)镸FC中STA的線程(類似于工作線程)是不具有消息循環(huán)的。

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

  4. 結(jié)論

  要實(shí)現(xiàn)一個(gè)偽異步工作的COM服務(wù)器,必須對(duì)連接點(diǎn)技術(shù)和COM線程模型進(jìn)行合理的組合使用,尤其線程模型的選擇更是我們實(shí)現(xiàn)高效COM服務(wù)器的關(guān)鍵。此外,作者個(gè)人推薦使用ATL來開發(fā)這樣一個(gè)服務(wù)器組件,因?yàn)樗`活,高效,對(duì)COM的各項(xiàng)技術(shù)均提供了極好的支持,尤其在對(duì)COM線程模型的支持方面,是MFC所不能比擬的。

  [參考文獻(xiàn)]

  [1]Tom Armstrong 等 (著),董梁 等(譯), ATL開發(fā)指南[M] ,北京:電子工業(yè)出版社

  [2]潘愛民,COM原理與應(yīng)用[M] , 北京:清華大學(xué)出版社

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

  [4]MSDN(2001),Eight Lessons from the COM School of Hard Knocks[C]

  [6]MSDN(2001)/Q15077,Descriptions and Workings of OLE Threading Models[C]

主站蜘蛛池模板: 亚洲欧美成人永久第一网站 | 黄色视频一级毛片 | 亚洲毛片在线 | 成人午夜又粗又硬有大 | 亚洲精品国产第1页 | 精品久久成人免费第三区 | 麻豆污视频| 免费看一级淫片成人 | 亚洲污视频 | 欧美69视频在线 | 综合婷婷 | 护士一级aaaaaa毛片 | 伊人影院中文字幕 | sese在线播放 | 日本黄区免费视频观看 | 欧美三级一区二区 | 国产特黄一级一片免费 | 999热成人精品国产免 | 国产成人精品高清在线观看99 | 国产乱码 | 精精国产xxxx视频在线播放器 | 欧美成人tv | 91精品啪在线看国产网站 | 黄视频福利 | 国产精品色图 | 国产一区二区网站 | 国内一级特黄女人精品片 | 丁香四月婷婷 | 日本japanesevideo护士 | 国产一区二区在免费观看 | 日韩欧美一区二区三区久久 | 亚洲综合一区二区不卡 | v视界影院视频一区二区三区 | 欧美日韩在线观看一区 | 岛国毛片在线观看 | 特级女人十八毛片a级 | 日韩福利视频一区 | 伊人中文字幕在线 | 福利视频在线播放 | 国产精品自在线拍国产 | 国产h视频在线观看高清 |