?

基于DLL的高精度定時器的設計方案

2016-09-08 09:23林培榕林姿瓊
電子設計工程 2016年13期
關鍵詞:調用線程進程

董 佩,林培榕,林姿瓊

(1.閩南師范大學 福建省粒計算及其應用重點實驗室,福建 漳州 363000;2.閩南師范大學 計算機學院,福建 漳州 363000)

基于DLL的高精度定時器的設計方案

董 佩1,林培榕2,林姿瓊1

(1.閩南師范大學 福建省粒計算及其應用重點實驗室,福建 漳州363000;2.閩南師范大學 計算機學院,福建 漳州363000)

定時器的使用在程序開發工作中使用廣泛,然而在動態鏈接庫中卻沒有直接實現的定時器工具;為了提高開發效率,本文在分析了有關定時器技術的實現及動態庫特性的基礎上,利用C++語言,結合策略模式的程序設計方法在動態庫中實現了高精度可擴展的定時器,并封裝成模塊提供給其它進程調用。經實際項目驗證本方案可行,對有關定時功能的開發能提高50%的開發效率。

動態庫;定時器;策略模式;C++

鏈接庫是將某些功能進行封裝打包而成的模塊,然后分兩種方式供主功能程序調用。一種是靜態鏈接方式:主進程在調用靜態鏈接庫的時候直接加載dll文件,其它進程在調用該鏈接庫文件的時候再重新加載;另一種為動態鏈接方式:此方式下內存中只有鏈接庫的一份實例,在進程需要的時候進行動態的加載,多個進程在調用同一個動態鏈接庫(DLL)時只是將DLL的地址映射到自己的進程空間中,從而實現多個進程共享了磁盤空間中的單個DLL。DLL可以大幅度的提高程序的復用度,減少程序代碼量,縮短開發周期,同樣也降低了模塊間的耦合性。當程序需要在某個時間間隔到來時執行特定的操作時都會用到定時器,對定時器的使用頻率較高,比如某基站定時向網管中心發送自己運行狀態信息等。雖然在MFC框架利用消息響應機制實現了一個定時器供開發者使用,但是卻有著優先級別低,精度不夠,必須依賴消息響應機制而導致效率低和使用范圍受限的缺點。將定時器功能封裝成DLL模塊并提供公共的訪問接口,可以讓進程或線程在任何需要使用定時器的場景下調用該DLL模塊來完成相應功能,有效避免了重復開發,增加開發效率。

1 系統結構

為了提高復用度,舍棄靜態鏈接方式而選用在動態鏈接方式實現定時器,本方案中主進程調用DLL來完成定時功能的總體結構圖如圖1所示。

圖1 主進程與DLL間的調用

當某線程需要啟動定時功能時,調用DLL提供的訪問接口啟動定時器,并提供該定時事件對應的ID(整型數據標識)和定時周期等,DLL中定時功能啟動后開始以毫秒為單位計時,當時鐘周期到來時DLL中定時器響應部分調用主線程提供的回調接口,回調接口再調用線程中具體響應部分,從而完成一次啟動定時到響應定時的過程,多個定時器用ID來進行區分標識。

2 關鍵技術及功能具體實現

2.1回調功能

回調函數通常是線程提供給DLL調用的函數,也用于線程間調用,主要是用來截獲有用消息、處理一些異步事件和獲取相關系統信息。應用程序將回調函數的入口地址作為參數傳給DLL,然后DLL就可以通過該地址在需要的時候調用回調函數來完成某項功能?;卣{函數需要遵守規定好的傳遞方式,并且參數格式也需要嚴格的設置成一致,否則在調用DLL的時候就會發生運行錯誤或者是系統崩潰?;卣{機制支持自定義的調用方式,但是大多情況下回調函數采用的都是標準應用程序接口的調用方式,也就是__stdcall。在__stdcall方式下,回調函數和大多普通函數一樣都是先將函數參數按從右到左的順序壓入臨時??臻g,然后在函數需要返回時將參數出棧,釋放內存空間[1]。本方案中用到了兩處回調。在主進程安插了一個回調函數,在線程加載DLL文件之后就將此回調函數地址指針傳給DLL,在DLL定時成功響應的時候可通過該函數地址調用回調函數,再在回調函數中調用主線程中的定時響應函數,這樣就完成了DLL與主進程的實時交互。第二個回調用在DLL模塊中,提供給定時組件,讓其回調一個指定函數,從而在該函數可以調用定時響應函數。

2.2策略模式

設計模式是在程序開發工作中對經常遇到的設計問題的可再現的解決方案,策略模式是其中的一種,利用面向對象的繼承和多態機制來定義一組算法,將每個算法都封裝起來,并且使他們之間可以互換[2]。通用類圖如圖2所示。

圖2 策略模式類圖

不同的具體策略類都需要繼承抽象的策略接口,對公共的方法接口進行具體實現。在抽象使用者接口中封裝了一個指向抽象策略對象的指針,對于不同的使用者類都要繼承抽象的使用者接口,在子類的具體對象中需要選擇一個具體策略對象來對該指針進行初始化,如此就可以通過該指針調用公共的方法讓對應的策略得到運行,實現了動態綁定不同的策略。這種模式具有極高的可擴展性,不管是增加或修改具體策略還是具體使用者,只需要繼承對應的抽象類、完成相應功能,而不會對原系統結構造成大的影響。

2.3DLL中定時功能的實現

定時組件選用多媒體定時器(timeSetEvent),它有著定時精度高,穩定性強的優點[3]。對策略模式進行改進,然后配合回調機制來實現整個定時流程,具體實現如圖3所示。

在DLL中定義了抽象的定時策略,提供了定時器開啟的函數接口,然后本方案中創建一個抽象定時器的實現類CMMTimer,完成定時器的啟動、定時器對象(封裝了實際的定時器ID標識,需要循環的次數,定時器到達的次數等參數)的查找、定時功能的關閉等功能,并將啟動的定時器對象保存到map容器中(健為定時器ID)。定義了一個抽象的定時器使用者類CtimerListener,提供定時響應的接口函數OnMMTimer()和一個抽象策略指針。這種策略模式下當主進程傳來開啟定時器的需求時,可根據主進程的需要封裝不同的使用者對象,然后在該對象中選取一種定時策略 (本方案中選用基于timeSetEvent的定時策略,當需要使用基于SetWaitableTimer方式的定時策略時只需較小的改動就能實現功能擴展)并創建對象來啟動定時,當時鐘周期來到時通過在回調函數中用基類CtimerListener的指針調用OnMMTimer()的方式可以實現與不同使用者對象響應函數的動態綁定。

圖3 定時功能實現流程圖

3 結論

文中提供了用DLL封裝出一種高精度定時模塊的方法,能減少程序開發工作中對定時功能的重復開發。因為在DLL中沒有封裝好的定時工具,于是本文重點闡述了如何在DLL中實現定時功能。通過引入了策略模式的程序設計方法,支持根據不同的場景需求來添加或裁剪定時器功能,同時也支持用其他方法(如SetWaitableTimer)擴展出其它定時器,提高了模塊的擴展性和可維護性。通過實際項目的穩定運行驗證了該方案的可行性。

[1]張立明.IP網絡業務行為分析[D].北京:北京郵電大學,2008.

[2]秦小波.設計模式之禪[M].北京:機械工業出版社,2014.

[3]王鵬飛,王鵬.基于Visual C6.0的Windows應用程序定時器研究[J].計算機技術與發展,2013,23(2):45-47.

[4]翼榮華,祁力鈞,傅澤田.基于Visual C++的精確定時技術與應用[J].農機化研究,2007(5):191-193.

[5]TANGang Hong-zhong,HUANG Hui-xian,YIN Lin.Applicaion of VC+DLL timer in design of industrial control software[J].Ordnance Industry Automatioin,2003,18(6):781-784.

[6]Erich Gammam,Richard Helm,Ralph Johnson,et al.Design patterns elements of reusable object-oriented software[M]. America:Pearson Education,2000:50-200.

Design scheme of High-precision timer based on DLL

DONG Pei1,LIN Pei-rong2,LIN Zi-qiong1
(1.Lab of Granular Computing,Minnan Normal University,Zhangzhou 363000,China;2.School of Computing,Minnan Normal University,Zhangzhou 363000,China)

The Timer is widely used in program development by R&D personnel.However,there was no direct way to implement the Timer in Dynamic link library.In order to improve development efficiency,this paper based on analyzing the relevant technology of Timer implementation and the property of DLL,and used C++and a programming technique of strategy Pattern to implement High-precision and expansible Timer.Meanwhile,it packaged into a module to provide other processes with calling.This program is feasible testified by the actual project,and it can improve the developing efficiency of 50%on the Timer development.

DLL;timer;strategy pattern;C++

TN929.5

A

1674-6236(2016)13-0059-02

2015-07-13稿件編號:201507091

福建省教育廳項目(JA14194)

董 佩(1989—),女,湖北孝感人,碩士研究生。研究方向:網絡技術。

猜你喜歡
調用線程進程
基于C#線程實驗探究
基于國產化環境的線程池模型研究與實現
核電項目物項調用管理的應用研究
債券市場對外開放的進程與展望
改革開放進程中的國際收支統計
淺談linux多線程協作
基于系統調用的惡意軟件檢測技術研究
社會進程中的新聞學探尋
利用RFC技術實現SAP系統接口通信
俄羅斯現代化進程的阻礙
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合