欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種基于DSS框架的數(shù)據(jù)庫(kù)子系統(tǒng)設(shè)計(jì)方法與流程

文檔序號(hào):12465068閱讀:271來(lái)源:國(guó)知局
一種基于DSS框架的數(shù)據(jù)庫(kù)子系統(tǒng)設(shè)計(jì)方法與流程

本發(fā)明涉及一種基于DSS框架的數(shù)據(jù)庫(kù)子系統(tǒng)設(shè)計(jì)方法。



背景技術(shù):

Darwin Streaming Server簡(jiǎn)稱(chēng)DSS。DSS是Apple公司提供的開(kāi)源實(shí)時(shí)流媒體播放服務(wù)器程序,整個(gè)程序使用純粹C++編寫(xiě),在設(shè)計(jì)上遵循高性能、簡(jiǎn)單、模塊化等程序設(shè)計(jì)原則,務(wù)求做到程序高效,可擴(kuò)充性好,因此DSS服務(wù)器系統(tǒng)在跨平臺(tái)的支持上是相當(dāng)理想的,它可以運(yùn)行在Windows NT、Windows 2000及以上的windows內(nèi)核版本,同時(shí)也能良好的運(yùn)行在*NIX的各種版本上,包括Mac OS X,Linux,F(xiàn)reeBSD,Solaris,同時(shí)DSS基于標(biāo)準(zhǔn)的流媒體協(xié)議RTSP,RTP/RTCP進(jìn)行開(kāi)發(fā),因此在運(yùn)用上具有極強(qiáng)的廣泛性和通用性。

在此基礎(chǔ)上,DSS框架設(shè)計(jì)成一個(gè)較為復(fù)雜的,層次結(jié)構(gòu)較為清晰的流媒體服務(wù)器系統(tǒng),主要由基礎(chǔ)功能組件(網(wǎng)絡(luò),字符串處理,內(nèi)存開(kāi)辟釋放,模塊工具,內(nèi)部錯(cuò)誤消息定義,全局?jǐn)?shù)據(jù)字典等等),各種子系統(tǒng)(RTSP,RTP,RTCP等等),各種功能插件(身份驗(yàn)證,身份授權(quán),數(shù)據(jù)流預(yù)處理,數(shù)據(jù)流處理,HTTP隧道處理,服務(wù)器消息回復(fù)等等)組合而成,很多開(kāi)發(fā)人員主要會(huì)進(jìn)行各種功能插件的開(kāi)發(fā),在服務(wù)器啟動(dòng)的時(shí)候進(jìn)行動(dòng)態(tài)加載,當(dāng)主流程狀態(tài)機(jī)處理到相應(yīng)狀態(tài)的時(shí)候?qū)⒄{(diào)用對(duì)應(yīng)的插件,此時(shí)服務(wù)器將控制權(quán)交給插件進(jìn)行相應(yīng)功能運(yùn)作。因此,在這個(gè)基礎(chǔ)上從使用結(jié)構(gòu)的角度上,服務(wù)器被分成兩個(gè)大塊,服務(wù)器內(nèi)部以及服務(wù)器外部,服務(wù)器內(nèi)部由各種基礎(chǔ)功能組件和子系統(tǒng)所組成,服務(wù)器外部由功能插件組成,這兩個(gè)部分之間通過(guò)函數(shù)指針設(shè)計(jì)成的API接口進(jìn)行數(shù)據(jù)的交互以及基礎(chǔ)功能的實(shí)現(xiàn)。

然而開(kāi)發(fā)人員在進(jìn)行開(kāi)發(fā)的過(guò)程中往往不止需要設(shè)計(jì)插件,同時(shí)也需要對(duì)服務(wù)器內(nèi)部進(jìn)行必要的功能增加或者修改,現(xiàn)有DSS框架對(duì)于音視頻數(shù)據(jù)流之外的數(shù)據(jù)來(lái)源均從配置文件中進(jìn)行加載,包括服務(wù)器啟動(dòng)的大量配置參數(shù),子系統(tǒng)運(yùn)行過(guò)程中需要的數(shù)據(jù),模塊插件所需要的數(shù)據(jù),例如對(duì)于身份驗(yàn)證,對(duì)于接入IP段的限制等等,這在很大程度上對(duì)項(xiàng)目的實(shí)際使用造成極大的不方便,因此在DSS框架中加入數(shù)據(jù)庫(kù)的功能是實(shí)際項(xiàng)目運(yùn)用中非常必要的,而現(xiàn)有的DSS框架中的數(shù)據(jù)庫(kù)功能設(shè)計(jì)較為簡(jiǎn)單,并沒(méi)有根據(jù)DSS框架的分時(shí)特點(diǎn),以及數(shù)據(jù)庫(kù)操作數(shù)據(jù)的及時(shí)性特點(diǎn)也就是在DSS分時(shí)框架中的需要另數(shù)據(jù)庫(kù)任務(wù)產(chǎn)生搶占功能,并且在保護(hù)好原來(lái)任務(wù)各種狀態(tài)的前提下中斷原來(lái)任務(wù),在成功從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)之后再恢復(fù)原來(lái)任務(wù),導(dǎo)致在使用上會(huì)出現(xiàn)各種意料之外的嚴(yán)重問(wèn)題。為了避免這些問(wèn)題,本發(fā)明綜合上述提到的服務(wù)器特點(diǎn)以及ODBC(Open Database connect 開(kāi)放數(shù)據(jù)互連)方式的數(shù)據(jù)庫(kù)運(yùn)用,詳細(xì)設(shè)計(jì)了基于DSS分時(shí)框架ODBC子系統(tǒng)功能。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明的一個(gè)目的在于提供一種基于DSS框架的數(shù)據(jù)庫(kù)子系統(tǒng)設(shè)計(jì)方法,解決了現(xiàn)有DSS框架下數(shù)據(jù)庫(kù)子系統(tǒng)任務(wù)搶占、功能簡(jiǎn)單及其衍生的各類(lèi)問(wèn)題。

為了實(shí)現(xiàn)上述目的,本發(fā)明的技術(shù)方案如下:

一種基于DSS框架的數(shù)據(jù)庫(kù)子系統(tǒng)設(shè)計(jì)方法,包括以下步驟:

步驟1、在DSS組件結(jié)構(gòu)中設(shè)計(jì)數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)繼承自DSS系統(tǒng)線程類(lèi)、設(shè)計(jì)數(shù)據(jù)庫(kù)任務(wù)類(lèi)繼承自DSS任務(wù)類(lèi);該數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)作為數(shù)據(jù)庫(kù)線程組件用于以一條獨(dú)立且唯一的線程負(fù)責(zé)推送數(shù)據(jù)庫(kù)任務(wù),且該條線程負(fù)責(zé)維護(hù)一個(gè)任務(wù)堆,這個(gè)任務(wù)堆將最近時(shí)間片任務(wù)彈出送往實(shí)際工作線程;該數(shù)據(jù)庫(kù)任務(wù)類(lèi)用于在DSS服務(wù)器啟動(dòng)的時(shí)候調(diào)用靜態(tài)初始化函數(shù)啟動(dòng)數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)中的線程,還用于調(diào)用數(shù)據(jù)庫(kù)任務(wù)類(lèi)線程接口執(zhí)行數(shù)據(jù)庫(kù)任務(wù)的插入數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)中優(yōu)先隊(duì)列的操作以及用于維護(hù)任務(wù)的各種屬性和操作函數(shù),所述數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)和數(shù)據(jù)庫(kù)任務(wù)類(lèi)互為友元類(lèi);

步驟2、在DSS子系統(tǒng)結(jié)構(gòu)中設(shè)計(jì)數(shù)據(jù)庫(kù)子系統(tǒng)類(lèi)以及子系統(tǒng)執(zhí)行接口類(lèi);該數(shù)據(jù)庫(kù)子系統(tǒng)類(lèi)子系統(tǒng)類(lèi)首先是作為一個(gè)容器繼承自數(shù)據(jù)庫(kù)接口類(lèi),負(fù)責(zé)各種數(shù)據(jù)庫(kù)任務(wù)相關(guān)檢查以及最重要的運(yùn)行函數(shù),該運(yùn)行函數(shù)用于執(zhí)行實(shí)際的數(shù)據(jù)庫(kù)操作并且將執(zhí)行結(jié)果存放在DSS數(shù)據(jù)系統(tǒng)中的數(shù)據(jù)庫(kù)子系統(tǒng)數(shù)據(jù)字典中,為真正的重要執(zhí)行函數(shù);該數(shù)據(jù)庫(kù)接口負(fù)責(zé)執(zhí)行數(shù)據(jù)庫(kù)初始化工作以及全局?jǐn)?shù)據(jù)字典的初始化;

步驟3、在DSS框架的Private.h文件中的回調(diào)函數(shù)結(jié)構(gòu)中增加數(shù)據(jù)庫(kù)操作的回調(diào)函數(shù)定義;

在Callbacks.h文件中增加數(shù)據(jù)庫(kù)操作函數(shù)聲明,同時(shí)在Callbacks.cpp文件中增加聲明函數(shù);

在QTSS.h中引用數(shù)據(jù)庫(kù)操作函數(shù)的聲明;

在qtsserver.cpp中的初始化回調(diào)函數(shù)中完成對(duì)數(shù)據(jù)庫(kù)操作函數(shù)的函數(shù)指針賦值;完成由DSS框架內(nèi)部到DSS框架外部插件的API接口設(shè)計(jì)。

優(yōu)選的,所述步驟1中,在DSS組件結(jié)構(gòu)中的通用工具類(lèi)庫(kù)中設(shè)計(jì)數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)繼承自DSS系統(tǒng)線程類(lèi)、設(shè)計(jì)數(shù)據(jù)庫(kù)任務(wù)類(lèi)繼承自DSS框架的任務(wù)類(lèi),數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)作為數(shù)據(jù)庫(kù)線程組件,是DSS框架中唯一運(yùn)行的數(shù)據(jù)庫(kù)任務(wù)推動(dòng)線程,也是構(gòu)成數(shù)據(jù)庫(kù)子系統(tǒng)的基礎(chǔ)組件。

優(yōu)選的,所述數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)包括一個(gè)堆數(shù)據(jù)結(jié)構(gòu)的成員變量,即優(yōu)先隊(duì)列,這個(gè)優(yōu)先隊(duì)列是由一完全二叉樹(shù)構(gòu)造而成,該完全二叉樹(shù)的父節(jié)點(diǎn)始終大于或者小于左右子節(jié)點(diǎn),這個(gè)優(yōu)先隊(duì)列用于將時(shí)間片最近的數(shù)據(jù)庫(kù)任務(wù)推往樹(shù)根節(jié)點(diǎn),同時(shí)也包括對(duì)于堆變量進(jìn)行搶占保護(hù)的堆互斥量以及驅(qū)動(dòng)堆變量工作的堆信號(hào)量。

優(yōu)選的,所述數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)包括一個(gè)入口函數(shù),該函數(shù)用于判斷是否存在任務(wù)元素,當(dāng)任務(wù)堆長(zhǎng)度是否大于0時(shí)存在任務(wù)元素,如果已經(jīng)存在任務(wù)元素,則入口函數(shù)再判斷當(dāng)前任務(wù)元素中的時(shí)間片是否已經(jīng)到達(dá)超時(shí),如果當(dāng)前任務(wù)的時(shí)間片已經(jīng)超時(shí)則將當(dāng)前任務(wù)發(fā)送到DSS框架中的任務(wù)線程中進(jìn)行實(shí)際運(yùn)行數(shù)據(jù)庫(kù)任務(wù);

所述數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)還包括一個(gè)執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句函數(shù),該執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句函數(shù)用于將數(shù)據(jù)庫(kù)任務(wù)指針推進(jìn)堆變量,同時(shí)增加長(zhǎng)度,驅(qū)動(dòng)任務(wù)線程類(lèi)的入口函數(shù)進(jìn)行工作。

優(yōu)選的,所述數(shù)據(jù)庫(kù)任務(wù)類(lèi)包括一個(gè)靜態(tài)初始化函數(shù)和封裝了數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)中真正執(zhí)行函數(shù)的執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句函數(shù),該靜態(tài)初始化函數(shù)在系統(tǒng)啟動(dòng)過(guò)程中系統(tǒng)初始化函數(shù)時(shí)被調(diào)用,調(diào)用該靜態(tài)初始化函數(shù)時(shí)數(shù)據(jù)庫(kù)任務(wù)推送線程開(kāi)始運(yùn)行;

該執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句函數(shù)作為數(shù)據(jù)庫(kù)的API接口基礎(chǔ),在API將提供給DSS框架的外部插件使用時(shí)調(diào)用。

優(yōu)選的,所述數(shù)據(jù)庫(kù)任務(wù)類(lèi)包括堆成員類(lèi),堆成員類(lèi)作為數(shù)據(jù)庫(kù)任務(wù)類(lèi)的成員變量,也作為數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)這個(gè)友元類(lèi)的成員變量,堆成員變量具有保存任務(wù)指針的變量以及當(dāng)前任務(wù)時(shí)間片的超時(shí)時(shí)間;

所述數(shù)據(jù)庫(kù)任務(wù)類(lèi)還包括數(shù)據(jù)庫(kù)任務(wù)事件枚舉結(jié)構(gòu),在任務(wù)事件枚舉結(jié)構(gòu)中定義當(dāng)數(shù)據(jù)庫(kù)任務(wù)實(shí)際被送入DSS工作線程運(yùn)行時(shí)需要執(zhí)行的事件定義。

優(yōu)選的,數(shù)據(jù)庫(kù)接口包括一個(gè)靜態(tài)初始化函數(shù),該靜態(tài)初始化函數(shù)在數(shù)據(jù)庫(kù)子系統(tǒng)正式啟動(dòng)之前預(yù)先調(diào)用,負(fù)責(zé)對(duì)數(shù)據(jù)庫(kù)子系統(tǒng)的相關(guān)數(shù)據(jù)進(jìn)行全局?jǐn)?shù)據(jù)字典的開(kāi)辟,這些數(shù)據(jù)字典將在DSS框架內(nèi)部和外部插件進(jìn)行交互使用。

優(yōu)選的,所述步驟2中,在DSS子系統(tǒng)結(jié)構(gòu)的Server.tproj結(jié)構(gòu)中設(shè)計(jì)數(shù)據(jù)庫(kù)子系統(tǒng)類(lèi),這個(gè)類(lèi)繼承自數(shù)據(jù)庫(kù)接口以及DSS框架中的變長(zhǎng)字符串格式化類(lèi)。數(shù)據(jù)庫(kù)類(lèi)將作為真正的任務(wù)載體送入DSS框架的工作線程中運(yùn)行;

所述步驟3之后還包括步驟4:在DSS子系統(tǒng)結(jié)構(gòu)的Server.tproj結(jié)構(gòu)中設(shè)計(jì)數(shù)據(jù)庫(kù)子系統(tǒng)的接口類(lèi),該接口類(lèi)繼承自字典類(lèi)以及數(shù)據(jù)庫(kù)任務(wù)類(lèi),其中字典類(lèi)為DSS框架中的數(shù)據(jù)字典類(lèi),這該接口類(lèi)用于提供執(zhí)行數(shù)據(jù)庫(kù)方式的數(shù)據(jù)庫(kù)操作中的各種操作接口,還用于保存數(shù)據(jù)庫(kù)中各個(gè)屬性參數(shù)的值,以及用于保存著數(shù)據(jù)庫(kù)任務(wù)執(zhí)行之后的返回結(jié)果集。

優(yōu)選的,數(shù)據(jù)庫(kù)包括一個(gè)靜態(tài)初始化函數(shù)、一個(gè)真正任務(wù)執(zhí)行函數(shù)以及運(yùn)行函數(shù),該靜態(tài)初始化函數(shù)進(jìn)行任務(wù)的輔助信息初始化;該真正任務(wù)執(zhí)行函數(shù)在DSS框架工作線程中將被提取出來(lái)執(zhí)行;該運(yùn)行函數(shù)執(zhí)行數(shù)據(jù)庫(kù)方式下的數(shù)據(jù)庫(kù)操作,數(shù)據(jù)庫(kù)操作為:首先獲取SQL語(yǔ)句,然后送入數(shù)據(jù)庫(kù)語(yǔ)句執(zhí)行函數(shù)中,接著獲取執(zhí)行結(jié)果集計(jì)數(shù)以及最后結(jié)果存放進(jìn)數(shù)據(jù)庫(kù)接口中的數(shù)據(jù)字典變量;

對(duì)于數(shù)據(jù)庫(kù)運(yùn)行函數(shù)的結(jié)果集使用DSS框架中可變長(zhǎng)度的字符串格式化類(lèi),這個(gè)類(lèi)在構(gòu)造函數(shù)的時(shí)候?qū)?huì)開(kāi)辟預(yù)定于大小的空間用于存放結(jié)果集,如果結(jié)果集大于預(yù)定于大小的空間會(huì)自動(dòng)開(kāi)辟2倍原大小的空間。

優(yōu)選的,對(duì)于數(shù)據(jù)庫(kù)操作函數(shù):執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句內(nèi)部實(shí)現(xiàn)中使用數(shù)據(jù)庫(kù)對(duì)象指向?qū)嶋H執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句的參數(shù)默認(rèn)為0,也即另數(shù)據(jù)庫(kù)任務(wù)需要從堆中立即被推進(jìn)實(shí)際工作線程,同時(shí)回到調(diào)用模塊中,數(shù)據(jù)庫(kù)的API一旦調(diào)用就要使用返回一個(gè)以毫秒為單位的數(shù)值進(jìn)行中斷當(dāng)前任務(wù)模塊。

采用上述方案后,本發(fā)明的有益效果是:本發(fā)明根據(jù)DSS框架的分時(shí)特點(diǎn),以及數(shù)據(jù)庫(kù)操作數(shù)據(jù)的及時(shí)性特點(diǎn),設(shè)計(jì)的數(shù)據(jù)庫(kù)子系統(tǒng)設(shè)計(jì)方法,解決了現(xiàn)有DSS框架下數(shù)據(jù)庫(kù)子系統(tǒng)任務(wù)搶占、功能簡(jiǎn)單及其衍生的各類(lèi)問(wèn)題,設(shè)計(jì)的數(shù)據(jù)庫(kù)子系統(tǒng)可在DSS框架內(nèi)部方便的使用數(shù)據(jù)庫(kù)操作,并且開(kāi)放出完善的數(shù)據(jù)庫(kù)API操作接口提供給DSS框架外部插件,使得基于DSS框架的開(kāi)發(fā)更加便捷,更符合實(shí)際項(xiàng)目的運(yùn)用。

以下結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明做進(jìn)一步說(shuō)明。

附圖說(shuō)明

圖1:本發(fā)明數(shù)據(jù)庫(kù)在DSS框架中的組件結(jié)構(gòu)示意圖;

圖2;本發(fā)明數(shù)據(jù)庫(kù)子系統(tǒng)在DSS框架中的結(jié)構(gòu)示意圖;

圖3-1;本發(fā)明數(shù)據(jù)庫(kù)子系統(tǒng)在DSS框架中驅(qū)動(dòng)狀態(tài)示意圖;

圖3-2為將時(shí)間片超時(shí)的任務(wù)推送進(jìn)任務(wù)類(lèi)任務(wù)線程狀態(tài)示意圖(等待13毫秒時(shí)間值任務(wù)已經(jīng)到達(dá),推送出去執(zhí)行);

圖3-3為將根據(jù)優(yōu)先隊(duì)列方式的等待14毫秒時(shí)間值任務(wù)推到樹(shù)根狀態(tài)示意圖;

圖3-4:對(duì)空節(jié)點(diǎn)進(jìn)行補(bǔ)充示意圖;

圖3-5:再次形成一完整隊(duì)列狀態(tài)示意圖;

圖4:本發(fā)明數(shù)據(jù)子系統(tǒng)在DSS外部插件中運(yùn)行示意圖。

具體實(shí)施方式

如圖1所示,本發(fā)明揭示的一種基于DSS框架的數(shù)據(jù)庫(kù)子系統(tǒng)設(shè)計(jì)方法,包括以下步驟:

第一步:在DSS組件結(jié)構(gòu)(通用工具類(lèi)庫(kù)CommonUtlitiesLib )中設(shè)計(jì)數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)(ODBCTaskThread)繼承自DSS系統(tǒng)線程類(lèi)(OSThread),設(shè)計(jì)數(shù)據(jù)庫(kù)任務(wù)類(lèi)(ODBCTask)繼承自DSS任務(wù)類(lèi)(Task),數(shù)據(jù)庫(kù)任務(wù)線程以一條獨(dú)立的唯一的線程負(fù)責(zé)推送數(shù)據(jù)庫(kù)任務(wù),這條線程主要維護(hù)一個(gè)任務(wù)堆(優(yōu)先隊(duì)列),這條線程將堆中最近時(shí)間片任務(wù)彈出送往實(shí)際工作線程:

上述數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)和數(shù)據(jù)庫(kù)任務(wù)類(lèi)互為友元類(lèi),數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)作為數(shù)據(jù)庫(kù)線程組件,是DSS框架中唯一運(yùn)行的數(shù)據(jù)庫(kù)任務(wù)推動(dòng)線程,也是構(gòu)成數(shù)據(jù)庫(kù)子系統(tǒng)的基礎(chǔ)組件;

第二步:在DSS子系統(tǒng)結(jié)構(gòu)(Server.tproj)中設(shè)計(jì)數(shù)據(jù)庫(kù)子系統(tǒng)類(lèi)(QTSSODBC)以及子系統(tǒng)執(zhí)行接口類(lèi)(QTSSODBCInterface);數(shù)據(jù)庫(kù)子系統(tǒng)類(lèi)首先是作為一個(gè)容器繼承自數(shù)據(jù)庫(kù)接口類(lèi),負(fù)責(zé)各種數(shù)據(jù)庫(kù)任務(wù)相關(guān)檢查以及最重要的運(yùn)行函數(shù)(Run),這個(gè)函數(shù)主要執(zhí)行實(shí)際的數(shù)據(jù)庫(kù)操作并且將結(jié)果存放在DSS數(shù)據(jù)系統(tǒng)中的數(shù)據(jù)庫(kù)子系統(tǒng)數(shù)據(jù)字典,是真正的重要執(zhí)行函數(shù):

第三步:對(duì)于數(shù)據(jù)庫(kù)接口類(lèi),它繼承自數(shù)據(jù)庫(kù)任務(wù)類(lèi),數(shù)據(jù)庫(kù)任務(wù)類(lèi)則再次繼承于DSS任務(wù)類(lèi),同時(shí),任務(wù)類(lèi)與系統(tǒng)線程類(lèi)互為友元類(lèi),在服務(wù)器初始化的時(shí)候,數(shù)據(jù)庫(kù)任務(wù)類(lèi)將會(huì)調(diào)用靜態(tài)初始化函數(shù)開(kāi)始啟動(dòng)數(shù)據(jù)庫(kù)線程,同時(shí)因?yàn)橄到y(tǒng)線程類(lèi)的入口函數(shù)為虛函數(shù),因此數(shù)據(jù)庫(kù)線程將運(yùn)行自己的唯一線程,也就是數(shù)據(jù)庫(kù)任務(wù)推送線程(將數(shù)據(jù)庫(kù)任務(wù)推送進(jìn)堆變量?jī)?yōu)先隊(duì)列中):

第四步:任務(wù)類(lèi)線程一直處于等待狀態(tài)中,它會(huì)等待兩種任務(wù)狀態(tài)的到來(lái),一種是在任務(wù)執(zhí)行過(guò)程中返回大于0值的任務(wù),這種類(lèi)型的任務(wù)將被存放在堆變量類(lèi)型(優(yōu)先隊(duì)列)的任務(wù)隊(duì)列里,當(dāng)時(shí)間片到達(dá)的時(shí)候,將優(yōu)先彈出這個(gè)隊(duì)列中的任務(wù)進(jìn)行運(yùn)行;第二種是普通任務(wù)的投遞,這種類(lèi)型的任務(wù)被投遞到正常的任務(wù)隊(duì)列中,當(dāng)優(yōu)先隊(duì)列中不存在任務(wù)的時(shí)候?qū)⒉檎疫@個(gè)普通任務(wù)隊(duì)列是否有時(shí)間片超時(shí)的任務(wù),如果有的話(huà)則開(kāi)始運(yùn)行對(duì)應(yīng)的運(yùn)行函數(shù):

第五步、如圖2所示:當(dāng)有一個(gè)需要被數(shù)據(jù)庫(kù)操作中斷的任務(wù)在任務(wù)類(lèi)線程中執(zhí)行的時(shí)候,她會(huì)返回一個(gè)以毫秒為單位的值將自己進(jìn)行中斷,中斷之后任務(wù)類(lèi)任務(wù)線程將會(huì)將其送進(jìn)任務(wù)類(lèi)線程中的堆變量(優(yōu)先隊(duì)列中),下一次當(dāng)返回值(時(shí)間片超時(shí))到達(dá)的時(shí)候,任務(wù)類(lèi)將優(yōu)先執(zhí)行優(yōu)先隊(duì)列中的任務(wù),只有當(dāng)優(yōu)先隊(duì)列中的任務(wù)執(zhí)行完之后才會(huì)執(zhí)行普通任務(wù)隊(duì)列中的任務(wù)。因此當(dāng)前任務(wù)被搶占之后,將開(kāi)始優(yōu)先執(zhí)行搶占任務(wù)也就是數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)任務(wù)的真正執(zhí)行者運(yùn)行函數(shù)。最后當(dāng)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)任務(wù)執(zhí)行完成之后,數(shù)據(jù)通過(guò)數(shù)據(jù)字典送進(jìn)數(shù)據(jù)區(qū),重新等待原先被搶占的任務(wù)執(zhí)行,此時(shí)原先任務(wù)將獲得數(shù)據(jù)庫(kù)數(shù)據(jù):

數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)還包括一個(gè)執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句函數(shù),該執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句函數(shù)用于將數(shù)據(jù)庫(kù)任務(wù)指針推進(jìn)堆變量,同時(shí)增加長(zhǎng)度,驅(qū)動(dòng)任務(wù)線程類(lèi)的入口函數(shù)進(jìn)行工作

第六步、如圖3系列(圖3-1、3-2、3-3、3-4)所示:任務(wù)類(lèi)線程中的入口函數(shù)如何將時(shí)間片已經(jīng)到達(dá)的任務(wù)推送到任務(wù)類(lèi)任務(wù)線程執(zhí)行的過(guò)程,圖3系列所示是如何使用優(yōu)先隊(duì)列的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)優(yōu)先級(jí)任務(wù)推送,優(yōu)先隊(duì)列是計(jì)算機(jī)科學(xué)中的一類(lèi)抽象數(shù)據(jù)類(lèi)型,優(yōu)先隊(duì)列中的每個(gè)元素都有各自的優(yōu)先級(jí),優(yōu)先級(jí)最高的元素最先得到服務(wù);優(yōu)先級(jí)相同的元素按照其在優(yōu)先隊(duì)列中的順序得到服務(wù),優(yōu)先隊(duì)列往往用堆來(lái)實(shí)現(xiàn)。在本發(fā)明中,優(yōu)先隊(duì)列的優(yōu)先級(jí)用任務(wù)中斷后再次運(yùn)行所需要等待的時(shí)間片表示,圖3系列中如果所有節(jié)點(diǎn)的時(shí)間值(優(yōu)先隊(duì)列中元素的優(yōu)先級(jí))為0的話(huà)則表示數(shù)據(jù)庫(kù)任務(wù)將立即被執(zhí)行,如果為其他數(shù)值,則表示被中斷的任務(wù)需要等待多久的時(shí)間片再次被執(zhí)行。

第七步、如圖4所示:在DSS框架Private.h文件中的回調(diào)函數(shù)結(jié)構(gòu)中增加數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)操作的回調(diào)函數(shù)定義,接著在Callbacks.h中增加數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)操作函數(shù)聲明,同時(shí)在Callbacks.cpp中實(shí)現(xiàn)聲明函數(shù),在QTSS.h中引用數(shù)據(jù)庫(kù)操作函數(shù)的聲明,最后在qtsserver.cpp中的初始化回調(diào)函數(shù)中完成對(duì)數(shù)據(jù)庫(kù)操作函數(shù)的函數(shù)指針賦值,完成由DSS框架內(nèi)部到DSS框架外部插件的API接口設(shè)計(jì)。當(dāng)系統(tǒng)外部插件需要使用數(shù)據(jù)庫(kù)功能,則調(diào)用系統(tǒng)內(nèi)定義好的API接口,同時(shí)對(duì)數(shù)據(jù)字典進(jìn)行搶占安全保護(hù)。

本發(fā)明上述Private.h文件、Callbacks.h文件、Callbacks.cpp文件均是DSS框架中已有定義文件,均分別具備其特有功能。

優(yōu)選的,數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)包括一個(gè)堆(堆變量、heap)數(shù)據(jù)結(jié)構(gòu)的成員變量,即優(yōu)先隊(duì)列,這個(gè)優(yōu)先隊(duì)列是由一完全二叉樹(shù)構(gòu)造而成,該完全二叉樹(shù)的父節(jié)點(diǎn)始終大于或者小于左右子節(jié)點(diǎn),這個(gè)優(yōu)先隊(duì)列用于將時(shí)間片最近的數(shù)據(jù)庫(kù)任務(wù)推往樹(shù)根節(jié)點(diǎn),同時(shí)也包括對(duì)于堆變量進(jìn)行搶占保護(hù)的堆互斥量(heapMutex)以及驅(qū)動(dòng)堆變量工作的堆信號(hào)量(heapCond)。

優(yōu)選的,所述數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)包括一個(gè)入口函數(shù)(Entry()),該函數(shù)用于判斷是否存在任務(wù)元素,當(dāng)任務(wù)堆長(zhǎng)度是否大于0時(shí)存在任務(wù)元素,如果已經(jīng)存在任務(wù)元素,則入口函數(shù)再判斷當(dāng)前任務(wù)元素中的時(shí)間片是否已經(jīng)到達(dá)超時(shí),如果當(dāng)前任務(wù)的時(shí)間片已經(jīng)超時(shí)則將當(dāng)前任務(wù)發(fā)送到DSS框架中的任務(wù)線程中進(jìn)行實(shí)際運(yùn)行數(shù)據(jù)庫(kù)任務(wù);任務(wù)類(lèi)線程一直處于等待狀態(tài)中,她會(huì)等待兩種任務(wù)狀態(tài)的到來(lái),一種是在任務(wù)執(zhí)行過(guò)程中返回大于0值的任務(wù),這種類(lèi)型的任務(wù)將被存放在堆變量類(lèi)型(優(yōu)先隊(duì)列)的任務(wù)隊(duì)列里,當(dāng)時(shí)間片到達(dá)的時(shí)候,將優(yōu)先彈出這個(gè)隊(duì)列中的任務(wù)進(jìn)行運(yùn)行。第二種是普通任務(wù)的投遞,這種類(lèi)型的任務(wù)被投遞到正常的任務(wù)隊(duì)列中,當(dāng)優(yōu)先隊(duì)列中不存在任務(wù)的時(shí)候?qū)⒉檎疫@個(gè)普通任務(wù)隊(duì)列是否有時(shí)間片超時(shí)的任務(wù),如果有的話(huà)則開(kāi)始運(yùn)行對(duì)應(yīng)的運(yùn)行函數(shù)。

優(yōu)選的,所述數(shù)據(jù)庫(kù)任務(wù)類(lèi)包括一個(gè)靜態(tài)初始化函數(shù)(static void Initialize())和封裝了數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)中真正執(zhí)行函數(shù)的執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句函數(shù),該靜態(tài)初始化函數(shù)在系統(tǒng)啟動(dòng)過(guò)程中系統(tǒng)初始化函數(shù)時(shí)被調(diào)用,調(diào)用該靜態(tài)初始化函數(shù)時(shí)數(shù)據(jù)庫(kù)任務(wù)推送線程開(kāi)始運(yùn)行;

該執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句函數(shù)作為數(shù)據(jù)庫(kù)的API接口基礎(chǔ),在API將提供給DSS框架的外部插件使用時(shí)調(diào)用。

優(yōu)選的,所述數(shù)據(jù)庫(kù)任務(wù)類(lèi)包括堆成員類(lèi),堆成員類(lèi)作為數(shù)據(jù)庫(kù)任務(wù)類(lèi)(指針)的成員變量,也作為數(shù)據(jù)庫(kù)任務(wù)線程類(lèi)這個(gè)友元類(lèi)的成員變量,堆成員變量具有保存任務(wù)指針的變量以及當(dāng)前任務(wù)時(shí)間片的超時(shí)時(shí)間;

所述數(shù)據(jù)庫(kù)任務(wù)類(lèi)還包括數(shù)據(jù)庫(kù)任務(wù)事件枚舉結(jié)構(gòu),在任務(wù)事件枚舉結(jié)構(gòu)中定義當(dāng)數(shù)據(jù)庫(kù)任務(wù)實(shí)際被送入DSS工作線程運(yùn)行時(shí)需要執(zhí)行的事件定義。

優(yōu)選的,數(shù)據(jù)庫(kù)接口包括一個(gè)靜態(tài)初始化函數(shù),該靜態(tài)初始化函數(shù)在數(shù)據(jù)庫(kù)子系統(tǒng)正式啟動(dòng)之前預(yù)先調(diào)用,負(fù)責(zé)對(duì)數(shù)據(jù)庫(kù)子系統(tǒng)的相關(guān)數(shù)據(jù)進(jìn)行全局?jǐn)?shù)據(jù)字典的開(kāi)辟,這些數(shù)據(jù)字典將在DSS框架內(nèi)部和外部插件進(jìn)行交互使用。

優(yōu)選的,數(shù)據(jù)庫(kù)包括一個(gè)靜態(tài)初始化函數(shù)、一個(gè)真正任務(wù)執(zhí)行函數(shù)以及運(yùn)行函數(shù),該靜態(tài)初始化函數(shù)進(jìn)行任務(wù)的輔助信息初始化;該真正任務(wù)執(zhí)行函數(shù)在DSS框架工作線程中將被提取出來(lái)執(zhí)行;該運(yùn)行函數(shù)執(zhí)行數(shù)據(jù)庫(kù)方式下的數(shù)據(jù)庫(kù)操作,數(shù)據(jù)庫(kù)操作為:首先獲取SQL語(yǔ)句,然后送入數(shù)據(jù)庫(kù)語(yǔ)句執(zhí)行函數(shù)中,接著獲取執(zhí)行結(jié)果集計(jì)數(shù)以及最后結(jié)果存放進(jìn)數(shù)據(jù)庫(kù)接口中的數(shù)據(jù)字典變量;

對(duì)于數(shù)據(jù)庫(kù)運(yùn)行函數(shù)的結(jié)果集使用DSS框架中可變長(zhǎng)度的字符串格式化類(lèi),這個(gè)類(lèi)在構(gòu)造函數(shù)的時(shí)候?qū)?huì)開(kāi)辟預(yù)定于大小的空間用于存放結(jié)果集,如果結(jié)果集大于預(yù)定于大小的空間會(huì)自動(dòng)開(kāi)辟2倍原大小的空間。

優(yōu)選的,對(duì)于數(shù)據(jù)庫(kù)操作函數(shù):執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句內(nèi)部實(shí)現(xiàn)中使用數(shù)據(jù)庫(kù)對(duì)象指向?qū)嶋H執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句的參數(shù)默認(rèn)為0,也即另數(shù)據(jù)庫(kù)任務(wù)需要從堆中立即被推進(jìn)實(shí)際工作線程,同時(shí)回到調(diào)用模塊中,數(shù)據(jù)庫(kù)的API一旦調(diào)用就要使用返回一個(gè)以毫秒為單位的數(shù)值進(jìn)行中斷當(dāng)前任務(wù)模塊,因?yàn)閿?shù)據(jù)庫(kù)任務(wù)開(kāi)始搶占,對(duì)于以毫秒為單位返回的這個(gè)值就是原任務(wù)需要等待重新執(zhí)行的時(shí)間,這個(gè)時(shí)間需要根據(jù)當(dāng)前需要對(duì)數(shù)據(jù)庫(kù)操作的時(shí)間進(jìn)行判斷后設(shè)置,防止發(fā)生嵌套任務(wù)。

以上僅為本發(fā)明的具體實(shí)施例,并非對(duì)本發(fā)明的保護(hù)范圍的限定。凡依本案的設(shè)計(jì)思路所做的等同變化,均落入本案的保護(hù)范圍。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
简阳市| 扬中市| 永春县| 三穗县| 金溪县| 松滋市| 建昌县| 平原县| 岳西县| 广宗县| 凤冈县| 上杭县| 东乌珠穆沁旗| 浦城县| 普陀区| 托克逊县| 绵竹市| 乌拉特前旗| 金秀| 开封市| 洪洞县| 五大连池市| 合水县| 达尔| 昌江| 天全县| 洛宁县| 宕昌县| 九龙坡区| 湖南省| 老河口市| 光泽县| 健康| 广南县| 铁力市| 平度市| 崇左市| 花垣县| 永泰县| 青田县| 扬州市|