程焱明
(中國船舶重工集團(tuán)公司第七二三研究所 江蘇省揚(yáng)州市 225011)
原生定時(shí)器(Windows 系統(tǒng))、基于線程的定時(shí)器、面向?qū)ο蟮亩〞r(shí)器均屬于傳統(tǒng)的定時(shí)器模型,但這類定時(shí)器很容易在應(yīng)用中出現(xiàn)定時(shí)器失效、程序結(jié)構(gòu)混亂、軟件可讀性下降等問題。為保證定時(shí)器更好服務(wù)于電子戰(zhàn)指控系統(tǒng)開發(fā),正是本文圍繞該課題開展具體研究的原因所在。
電子戰(zhàn)軟件中的傳統(tǒng)定時(shí)器模型種類多樣,代表性較高的可細(xì)分為三類,包括原生定時(shí)器、基于線程的定時(shí)器、面向?qū)ο蟮亩〞r(shí)器,這類定時(shí)器存在的優(yōu)勢和不足必須得到重點(diǎn)關(guān)注。
Windows 系統(tǒng)存在原生定時(shí)器,該定時(shí)器看起來較為簡單,如在指定的窗口進(jìn)行定時(shí)器回調(diào)操作注冊,做好間隔時(shí)間設(shè)定,并最終響應(yīng)系統(tǒng)WM-TIMER 消息即可,通常情況下原生定時(shí)器可滿足相關(guān)需要。但對(duì)于電子戰(zhàn)指控系統(tǒng)來說,其本身對(duì)實(shí)時(shí)性存在較強(qiáng)要求,這種情況下原生定時(shí)器的應(yīng)用很容易引發(fā)意想不到的問題。原生定時(shí)器的回調(diào)處理基于響應(yīng)WM-TIMER 消息實(shí)現(xiàn),但由于WM-TIMER 消息處理在Windows 系統(tǒng)中的優(yōu)先級(jí)較低,在其它窗口消息存在于應(yīng)用程序消息隊(duì)列中時(shí),WM-TIMER 消息調(diào)度會(huì)被操作系統(tǒng)忽視,系統(tǒng)在指定時(shí)刻點(diǎn)上未能及時(shí)執(zhí)行處理回調(diào)的情況很容易出現(xiàn)。對(duì)于應(yīng)用程序不停接收通信鏈路數(shù)據(jù)的情況,由于系統(tǒng)需要對(duì)收到的數(shù)據(jù)進(jìn)行迅速處理并不停響應(yīng)網(wǎng)絡(luò)消息,此時(shí)定時(shí)器回調(diào)操作將沒有機(jī)會(huì)執(zhí)行,原生定時(shí)器會(huì)因此失效[1]。
為突破原生定時(shí)器性能瓶頸,基于多線程技術(shù)的定時(shí)器模型探索長期受到重視,通過開辟新的工作者線程獨(dú)立于主線程外,基于系統(tǒng)API 應(yīng)用程序接口,新線程內(nèi)部即可實(shí)現(xiàn)手工定時(shí)計(jì)數(shù),在指定的間隔時(shí)間達(dá)到后,實(shí)際的定時(shí)回調(diào)操作即可由收到通知的外部主線程完成。基于線程的定時(shí)器在理論上可行的,在具體的實(shí)踐應(yīng)用中也取得了不俗效果。但值得注意的是,基于線程的定時(shí)器涉及線程同步、線程通信、線程創(chuàng)建等多線程編程技術(shù),死鎖情況也很容易出現(xiàn)于線程同步過程中,這對(duì)開發(fā)人員提出了較高挑戰(zhàn)。對(duì)于需要使用多個(gè)定時(shí)器的電子戰(zhàn)軟件開發(fā)來說,如無法科學(xué)組織各定時(shí)器,將導(dǎo)致非?;靵y的程序結(jié)構(gòu)出現(xiàn),更為復(fù)雜的控制流程會(huì)直接影響軟件開發(fā)[2]。
圖1:組件式定時(shí)器的內(nèi)部結(jié)構(gòu)
為更好服務(wù)于軟件開發(fā),面向?qū)ο蠹夹g(shù)也被引入定時(shí)器領(lǐng)域,由此封裝基于線程的定時(shí)器,C++的封裝類得以產(chǎn)生,系統(tǒng)的健壯性可大幅提升。但對(duì)于規(guī)模不斷變大的軟件來說,愈加復(fù)雜的流程使得簡單封裝無法滿足實(shí)際需要。對(duì)于具備“對(duì)實(shí)現(xiàn)的封裝”特點(diǎn)的C++語言來說,與具體實(shí)現(xiàn)相關(guān)的代碼大量存在于封裝類中,同時(shí)與業(yè)務(wù)邏輯的聯(lián)系較少。大量零散的封裝類混雜于軟件結(jié)構(gòu)中,軟件可讀性因此下降。此外,其他語言中C++語言編寫的封裝類無法直接影響,多語言協(xié)同開發(fā)因此受到的影響必須得到重視,對(duì)于整個(gè)電子戰(zhàn)軟件來說,某些部分存在性能上較高指標(biāo),具體實(shí)現(xiàn)需使用C/C++等編譯性的語言,也有一些部分需要華麗的用戶界面、較快的開發(fā)速度且對(duì)性能要求較低,具體實(shí)現(xiàn)可采用ASP、VB 等存在較高靈活性的解釋性語言。在集成軟件過程中,最終軟件產(chǎn)品需結(jié)合各方面形成,考慮到不同的開發(fā)語言中定時(shí)器等具有共性的功能模塊需設(shè)法集成,由此引發(fā)的定時(shí)器跨語言問題必須得到重視。
為彌補(bǔ)電子戰(zhàn)軟件中的傳統(tǒng)定時(shí)器模型存在的缺陷,本文引入了組件式開發(fā)技術(shù),通過對(duì)基于線程的定時(shí)器進(jìn)行封裝即可同時(shí)提供跨語言解決方案。需要將龐大、單獨(dú)、復(fù)雜的應(yīng)用程序劃分為多個(gè)模塊,并應(yīng)用組件化程序設(shè)計(jì)思想,此時(shí)模塊不能被簡單的視作代碼集合,而是真正成為自給自足的組件,同一臺(tái)機(jī)器上可允許這類組件,廣域網(wǎng)、局域網(wǎng)、Internet 的不同機(jī)器上也可允許這類組件。分析理性化的組件系統(tǒng)可以發(fā)現(xiàn),組件內(nèi)部的結(jié)構(gòu)無需被用戶了解,所需工作可通過配置組件完成。為實(shí)現(xiàn)組件化軟件開發(fā),CORBA公共對(duì)象請求代理體系結(jié)構(gòu)由OMG 對(duì)象管理組織提出,UNIX 操作系統(tǒng)屬于該結(jié)構(gòu)的主要應(yīng)用平臺(tái)。微軟在Windows 平臺(tái)上提出了COM 標(biāo)準(zhǔn)組件對(duì)象模型,組件之間交互的規(guī)范由此明確,實(shí)現(xiàn)交互的環(huán)境也同時(shí)提供。對(duì)于不依賴于任何特定語言的組件對(duì)象之間交互來說,COM 可作為一種標(biāo)準(zhǔn)用于不同語言協(xié)作開發(fā)。
深入分析可以發(fā)現(xiàn),組件式軟件開發(fā)具備四方面優(yōu)勢,包括容易替換、能夠較好適應(yīng)需求變化、可實(shí)現(xiàn)二進(jìn)制代碼重用、較好服務(wù)于并行開發(fā)。所謂容易替換,指的是組件式開發(fā)技術(shù)可將龐大復(fù)雜的企業(yè)級(jí)應(yīng)用系統(tǒng)劃分為多個(gè)組件模塊,在版本升級(jí)和系統(tǒng)修改時(shí),可對(duì)相應(yīng)組件進(jìn)行替換或修改,其他部分不會(huì)受到影響;基于適應(yīng)需求變化進(jìn)行分析可以發(fā)現(xiàn),不明確的業(yè)務(wù)需求在軟件開發(fā)中較為常見,新的需求會(huì)在軟件配置及開發(fā)過程中不斷出現(xiàn),而在組件式開發(fā)技術(shù)支持下,通過在少數(shù)幾個(gè)組件中存放業(yè)務(wù)規(guī)則,即可通過重建并發(fā)布新組件或修改相關(guān)組件更好適應(yīng)業(yè)務(wù)規(guī)則,局部更新可同時(shí)在局部中局限出錯(cuò)機(jī)會(huì),軟件測試和調(diào)試的便利性將大幅提升;分析可實(shí)現(xiàn)二進(jìn)制代碼重用可以發(fā)現(xiàn),二進(jìn)制級(jí)別上的重用和集成可通過組件式開發(fā)實(shí)現(xiàn),即一次編寫代碼的多處使用,多個(gè)團(tuán)隊(duì)使用不同開發(fā)工具的協(xié)同工作可更好完成。如高實(shí)時(shí)性的算法分析組件由C++開發(fā)團(tuán)隊(duì)開發(fā),使用該組件的VB 開發(fā)團(tuán)隊(duì)無需進(jìn)行組件對(duì)應(yīng)VB 版本的針對(duì)性開發(fā),而是可以在同一個(gè)操作系統(tǒng)平臺(tái)下直接使用,這是由于組件為二進(jìn)制級(jí)別重用的;分析較好服務(wù)于并行開發(fā)可以發(fā)現(xiàn),對(duì)于由許多組件構(gòu)成的大應(yīng)用系統(tǒng)來發(fā),可同時(shí)進(jìn)行這類組件的開發(fā)。在具體開發(fā)過程中,需劃分業(yè)務(wù)邏輯為多個(gè)不同的組件,隨后進(jìn)行接口的針對(duì)性設(shè)計(jì),即可由開發(fā)團(tuán)隊(duì)并行開發(fā),各個(gè)組件可最終在系統(tǒng)集成階段順利集成[3]。
圖1為組件式定時(shí)器的內(nèi)部結(jié)構(gòu),具體設(shè)計(jì)基于COM 開展,定時(shí)器的內(nèi)部由COM 技術(shù)封裝,二進(jìn)制級(jí)的代碼重用的支持也同時(shí)實(shí)現(xiàn)。整個(gè)組件對(duì)外導(dǎo)出接口4 個(gè),即IUnknown、ISyncNotify、IAsyncNotify、IDispatch。
2.2.1 IUnknown 接口
分析IUnknown 接口可以發(fā)現(xiàn),每個(gè)COM 組件均必須導(dǎo)出該接口,其他所有接口的繼承也需要基于IUnknown 接口實(shí)現(xiàn),可見所有COM 接口的根為IUnknown 接口。IUnknown 接口共存在函數(shù)3 個(gè),提供接口查詢和組件的生存期控制兩個(gè)重要功能。外部用戶對(duì)組件的使用情況可基于Release 和Ad-dRef 確定,具體需要對(duì)組件內(nèi)部的成員變量m_cRef 進(jìn)行操作,組件生存期控制可由此實(shí)現(xiàn)。如存在減為0 的該變量,則說明組件沒有其它用戶使用,自身所占據(jù)的系統(tǒng)資源即可由組件自動(dòng)釋放,包括系統(tǒng)句柄等、內(nèi)存、數(shù)據(jù)庫等。在實(shí)例化1 個(gè)組件出來后,外部用戶開始可得到1 個(gè)IUnknown 接口,為滿足實(shí)際應(yīng)用需要,接口查詢需采用QueryInterface。如接口能夠由組件支持,1 個(gè)結(jié)果接口指針會(huì)隨之返回,組件功能可由用戶進(jìn)一步調(diào)用。
2.2.2 ISyncNotify 和IAsyncNotify 接口
分析ISyncNotify 和IAsyncNotify 接口可以發(fā)現(xiàn),具體的定時(shí)器邏輯由兩個(gè)接口實(shí)現(xiàn)。為方便使用并保持一致,采用相同結(jié)構(gòu)設(shè)計(jì)2 個(gè)接口,因此對(duì)于用戶存在一致的調(diào)用方式,具體差異存在于實(shí)現(xiàn)的功能上。ISyncNotify 接口的定時(shí)器通知采用同步的方式,IAsyncNotify 接口的定時(shí)器通知采用異步方式。基于調(diào)用約定進(jìn)行操作,事件的通知消息即可在指定的定時(shí)器間隔時(shí)刻點(diǎn)獲得。RegisterNotify 為請求組件注冊新的定時(shí)器通知事件,以ms 為單位的定時(shí)器間隔時(shí)間由interval 給出,umsg、hwnd 分別為通知消息和通知窗口。在注冊成功后,定時(shí)器通知的句柄為pid 接收的1 個(gè)ID。參數(shù)ID、UnregisterNotify 分別為定時(shí)器通知句柄、請求組件刪除指定的定時(shí)器通知事件。具體的接口實(shí)現(xiàn)需開辟工作者線程,每個(gè)同步定時(shí)器均需要開辟1 個(gè),定時(shí)器事件通知可由此實(shí)現(xiàn),整個(gè)系統(tǒng)中其它定時(shí)器工作因一個(gè)定時(shí)器事件處理阻塞而出現(xiàn)異常也可同時(shí)規(guī)避。對(duì)于不涉及到阻塞問題的異步定時(shí)器來說,考慮到其需要負(fù)責(zé)一個(gè)通知消息的簡單投遞,因此公共工作者線程的開辟極為關(guān)鍵。需充分考慮事件通知、定時(shí)計(jì)數(shù)、線程同步、優(yōu)先級(jí)等復(fù)雜的控制流程,在COM組件的封裝下,使用便利性提升可同時(shí)實(shí)現(xiàn)。
2.2.3 IDispatch 接口
IDispatch 接口屬于支持自動(dòng)化的核心接口,該接口在1 個(gè)數(shù)組中集中所有成員函數(shù)的入口地址,并在內(nèi)部維護(hù)1 個(gè)映射表。根據(jù)序號(hào)索引,外部用戶可快速找到需要的函數(shù)并進(jìn)行相應(yīng)功能執(zhí)行。對(duì)于HTML、ASP、VB 等解釋性語言,以及Excel、Word 等包公軟件提供的“宏”功能,均可對(duì)組件自動(dòng)化接口進(jìn)行較好訪問。IDispatch 接口提供的函數(shù)可用于組件支持的所有類型庫信息查詢,組件瀏覽器枚舉訪問的便利性可大幅提升。此外,基于函數(shù)名稱查詢索引編號(hào)、具體的函數(shù)調(diào)用執(zhí)行、遠(yuǎn)程計(jì)算機(jī)上組件接口函數(shù)調(diào)用也可基于IDispatch 接口實(shí)現(xiàn),由此需要調(diào)用的函數(shù)名稱可在運(yùn)行時(shí)動(dòng)態(tài)指定,需要調(diào)用的函數(shù)不必事先明確,動(dòng)態(tài)綁定可由此完成。IDispatch 接口在組件式定時(shí)器中的實(shí)現(xiàn)可較好服務(wù)于使用ASP、VB 進(jìn)行軟件開發(fā)的團(tuán)隊(duì),協(xié)同開發(fā)可由此更為便利開展。
結(jié)合實(shí)際調(diào)研可以發(fā)現(xiàn),結(jié)合組件式開發(fā)思想設(shè)計(jì)的組件式定時(shí)器現(xiàn)階段已在我國大型電子戰(zhàn)指揮系統(tǒng)中實(shí)現(xiàn)廣泛、成功應(yīng)用,組件式定時(shí)器在系統(tǒng)中的運(yùn)行極為穩(wěn)定,組件式開發(fā)技術(shù)的應(yīng)用價(jià)值由此得到證明。
綜上所述,電子戰(zhàn)軟件中組件式定時(shí)器開發(fā)需關(guān)注多方面因素影響。在此基礎(chǔ)上,本文涉及的組件式軟件開發(fā)、組件式定時(shí)器的設(shè)計(jì)、組件式定時(shí)器的應(yīng)用等內(nèi)容,則直觀展示了電子戰(zhàn)軟件中組件式定時(shí)器開發(fā)路徑。為更好服務(wù)于電子戰(zhàn)軟件開發(fā),性能優(yōu)良、反復(fù)測試組件的積極應(yīng)用必須得到重視。