本發(fā)明涉及列車信號控制系統(tǒng),尤其是涉及一種基于qt跨平臺的重用mfc消息映射代碼的方法、設(shè)備及介質(zhì)。
背景技術(shù):
1、基于信創(chuàng)的需求,既有的在用系統(tǒng)如調(diào)度集中系統(tǒng)、聯(lián)鎖系統(tǒng)、ats系統(tǒng)、監(jiān)測系統(tǒng)等要逐步轉(zhuǎn)移到國產(chǎn)軟硬件設(shè)備上。國產(chǎn)操作系統(tǒng)是基于linux的,這對在windows平臺上基于mfc開發(fā)的人機界面程序提出了較大的挑戰(zhàn),需要將既有的mfc程序轉(zhuǎn)換成qt程序,移植的工作量是比較大的。特別的,既有mfc程序和移植后qt程序會在工程上同時部署,都將會有相同功能的維護更新需求。
2、mfc和qt的差別是巨大的,既有mfc程序和移植后qt程序在代碼方面將會存在巨大的差別。這對于兩者的維護更新是很麻煩的。如果既有mfc程序和移植后的qt程序的差別不是特別大,對軟件的維護就很有利。
3、消息映射是mfc程序開發(fā)的基本方法,以mfc開發(fā)程序必然要使用到消息映射。on_message一般用于程序自定義的消息,這些消息通過windows?api函數(shù)sendmessage向目標(biāo)窗口發(fā)送,窗口過程接收到消息后再進行響應(yīng)處理。當(dāng)基于qt開發(fā)時,mfc的這些消息映射宏和sendmessage函數(shù)都不能使用。qt的基礎(chǔ)是信號和槽函數(shù),信號類似于windows的消息,槽函數(shù)類似于mfc的消息響應(yīng)函數(shù)。mfc程序的消息映射要么改造為qt的信號和槽函數(shù),要么直接使用c++的函數(shù)調(diào)用。如果采用c++函數(shù)調(diào)用方式,調(diào)用時需要具體的類而失去了抽象的特征,或者是抽象類定義虛函數(shù)而導(dǎo)致抽象類特別臃腫。如果采用信號和槽函數(shù)方式,不但要設(shè)計信號,還要在恰當(dāng)?shù)臅r機對信號和槽函數(shù)進行連接。這些都會帶來比較大的代碼變動。
4、如果既有的mfc程序不再維護,采用qt的信號和槽函數(shù)方式是可行的方案。然而mfc程序因為有大量既有工程應(yīng)用是需要持續(xù)維護的,新移植的qt程序也是需要持續(xù)維護的,兩個程序的代碼差別越大,維護的難度和工作量就越大。
5、cn115914330a公開了一種基于nio異步線程模型的異構(gòu)應(yīng)用間通信方法,針對大型集成信息系統(tǒng)中應(yīng)用軟件跨語言開發(fā),跨操作系統(tǒng),且應(yīng)用間需要針對不同業(yè)務(wù)場景需求進行實時通信的特點,結(jié)合了現(xiàn)有的通信協(xié)議與技術(shù),提供了一種高效的應(yīng)用間通信模型,為應(yīng)用層提供了點對點,訂閱發(fā)布,共享內(nèi)存等多種通信方式。但是,其僅僅是跨平臺的通信方法,并未給出跨平臺程序移植的方案。
技術(shù)實現(xiàn)思路
1、本發(fā)明的目的就是為了克服上述現(xiàn)有技術(shù)存在的缺陷而提供一種基于qt跨平臺的重用mfc消息映射代碼的方法、設(shè)備及介質(zhì),重用既有mfc程序的消息映射相關(guān)的代碼,減少移植時的代碼修改量,維持既有程序結(jié)構(gòu),提高同一功能的mfc程序和qt程序的相同代碼段。
2、本發(fā)明的目的可以通過以下技術(shù)方案來實現(xiàn):
3、根據(jù)本發(fā)明的第一方面,提供了一種基于qt跨平臺的重用mfc消息映射代碼的方法,該方法在將mfc程序移植到qt中時,保留mfc程序中與消息映射、消息響應(yīng)和消息發(fā)送相關(guān)的代碼,減少移植過程中的代碼變動,包括以下步驟:
4、基于qt定義mfc消息映射相關(guān)的數(shù)據(jù)類型、函數(shù)指針類型;
5、基于qt定義新的事件類型wsmevent及其類型值;
6、基于qt定義消息發(fā)送函數(shù),將消息內(nèi)容封裝到新定義的事件類型wsmevent中,并通過消息發(fā)送函數(shù)發(fā)送到目標(biāo);
7、定義事件處理函數(shù),當(dāng)事件處理函數(shù)收到qevent類型事件數(shù)據(jù)時,根據(jù)qevent類型事件的類型值判斷并轉(zhuǎn)換為wsmevent事件類型;
8、事件處理函數(shù)從wsmevent事件中取出消息id和消息參數(shù)數(shù)據(jù),根據(jù)目標(biāo)類的消息映射表查找消息id的匹配信息,即消息映射條目,獲得消息映射條目中的消息響應(yīng)函數(shù);調(diào)用消息響應(yīng)函數(shù)處理消息參數(shù)數(shù)據(jù),返回處理結(jié)果,并將處理結(jié)果記錄到wsmevent事件中;
9、基于消息發(fā)送函數(shù)將wsmevent事件中記錄的處理結(jié)果返回給調(diào)用者;
10、改造mfc中的宏begin_message_map,使之與qt平臺匹配,使得消息映射相關(guān)的宏declare_messagae_map、begin_message_map、end_message_map、on_message在qt仍能使用;
11、新增宏wm_decl_wndmsg、wm_impl_wndmsg,將事件處理相關(guān)的函數(shù)的聲明和實現(xiàn)封裝到宏代碼中,使得事件處理函數(shù)的代碼模式化。
12、作為優(yōu)選的技術(shù)方案,所述的事件類型wsmevent的類型值與其它事件類型的類型值不重復(fù),且按qt開發(fā)規(guī)則該類型值介于qevent::user=1000和qevent::maxuser=65535之間,一般可采用在qevent::user的基礎(chǔ)上加一個預(yù)設(shè)的數(shù)值確定,或者調(diào)用qt的registereventtype函數(shù)返回一個類型值。
13、作為優(yōu)選的技術(shù)方案,所述的事件類型wsmevent中定義有消息id、消息參數(shù)wparam和lparam、以及用于存儲處理結(jié)果的成員變量lresult,其中,所述消息id、wparam、lparam的類型分別為uint、wparam、lparam,lresult的類型為lresult;所述的基于qt定義mfc消息映射相關(guān)的數(shù)據(jù)類型包括但不限于uint、wparam、lparam、lresult。
14、作為優(yōu)選的技術(shù)方案,所述的事件處理函數(shù)是customevent虛函數(shù),事件處理函數(shù)將wsmevent中的消息id、wparam、lparam數(shù)據(jù)傳給消息處理函數(shù),基于消息映射表查找消息響應(yīng)函數(shù)然后調(diào)用消息響應(yīng)函數(shù)并將消息響應(yīng)函數(shù)的返回值存儲到wsmevent的成員變量lresult中。
15、作為優(yōu)選的技術(shù)方案,所述的消息處理函數(shù)從最終類的消息映射表開始查找消息響應(yīng)函數(shù),如果在當(dāng)前層級的消息映射表中沒有找到響應(yīng)的消息響應(yīng)函數(shù),則繼續(xù)在上一層級的消息映射表中查找,直至根層級消息映射表。
16、作為優(yōu)選的技術(shù)方案,所述的消息映射表由afx_msgmap結(jié)構(gòu)描述,包括上一層次或父類層次消息映射表的獲取函數(shù)指針pfngetbasemap和消息映射條目數(shù)組,afx_msgmap保留mfc原有的形式和語義,消息映射表afx_msgmap數(shù)據(jù)由declare_message_map聲明,由begin_message_map、end_message_map展開后設(shè)置數(shù)據(jù)。
17、作為優(yōu)選的技術(shù)方案,所述的消息映射表通過調(diào)用函數(shù)指針pfngetbasemap獲得上一層次的消息映射表,當(dāng)pfngetbasemap為空指針時表示為根消息映射表。消息映射表afx_msgmap中的pfngetbasemap數(shù)據(jù)由begin_message_map展開后設(shè)置。
18、作為優(yōu)選的技術(shù)方案,所述的消息處理函數(shù)通過afxfindmessageentry函數(shù)在消息映射條目數(shù)組中進行遍歷查找消息響應(yīng)函數(shù),afxfindmessageentry保留mfc原有的形式和語義。
19、作為優(yōu)選的技術(shù)方案,所述的消息映射條目中包括消息id、消息響應(yīng)函數(shù)及其它必要的數(shù)據(jù),由afx_msgmap_entry結(jié)構(gòu)描述,該結(jié)構(gòu)由on_message宏展開后在消息映射表中生成,afx_msgmap_entry和on_message保留mfc原有的形式和語義。
20、作為優(yōu)選的技術(shù)方案,所述的調(diào)用消息響應(yīng)函數(shù)具體為在消息處理函數(shù)查找到消息映射條目時,對消息映射條目中的響應(yīng)函數(shù)指針進行類函數(shù)調(diào)用,并且將獲得的消息參數(shù)wparam、lparam數(shù)據(jù)作為響應(yīng)函數(shù)調(diào)用的參數(shù)。
21、作為優(yōu)選的技術(shù)方案,所述的改造mfc中的宏begin_message_map是對mfc中的宏定義作適當(dāng)修改使得消息映射相關(guān)的宏與qt平臺匹配,具體為:begin_message_map的第二個參數(shù)是第一個參數(shù)的基類,當(dāng)?shù)诙€參數(shù)是qt中的類時則將第二個參數(shù)改為與第一個參數(shù)相同,否則,保持其第二個參數(shù)和mfc程序中的參數(shù)一致。
22、作為優(yōu)選的技術(shù)方案,所述的改造mfc中的宏begin_message_map,通過第二個參數(shù)與第一個參數(shù)是否相同來設(shè)置消息映射表afx_msgmap中的pfngetbasemap數(shù)據(jù),當(dāng)兩個參數(shù)相同時pfngetbasemap置為空函數(shù)指針,否則pfngetbasemap指向第二個參數(shù)所聲明的類的消息映射表的獲取函數(shù),即獲取父類或上一層次消息映射表的函數(shù)。
23、作為優(yōu)選的技術(shù)方案,所述的新增宏wm_decl_wndmsg用于展開事件處理函數(shù)的聲明,新增宏wm_impl_wndmsg用于展開事件處理函數(shù)的實現(xiàn)。
24、作為優(yōu)選的技術(shù)方案,所述的end_message_map、declare_message_map、on_message宏保留原有的mfc形式和語義。
25、作為優(yōu)選的技術(shù)方案,根據(jù)應(yīng)用的目標(biāo)類類型進行不同處理,所述目標(biāo)類類型包括消息映射最基類和消息映射繼承類,所述的消息映射最基類是指具備消息映射機制或功能的最開始的類,此類之上的所有基類都不具備消息映射機制或功能;所述的消息映射繼承類是指此類之上的某個直接基類或間接基類具備了消息映射機制或功能,此類也因此而具備消息映射機制或功能的類,消息映射繼承類泛指消息映射最基類的所有繼承類;判定一個類為消息映射最基類的方法是,此類的直接基類是qt中的類,且在mfc原程序中此類的直接基類是mfc中的類。
26、作為優(yōu)選的技術(shù)方案,所述方法應(yīng)用到消息映射繼承類時,移植既有mfc程序的頭文件和cpp文件,與消息映射相關(guān)代碼保持mfc程序原樣;方法應(yīng)用到消息映射最基類時,移植既有mfc程序的頭文件,在類定義中增加wm_decl_wndmsg宏應(yīng)用;移植既有mfc程序的cpp文件,增加wm_impl_wndmsg宏應(yīng)用,并且修改begin_message_map的第二個參數(shù)使其與第一個參數(shù)相同。
27、根據(jù)本發(fā)明的第二方面,提供了一種電子設(shè)備,包括存儲器和處理器,所述存儲器上存儲有計算機程序,所述處理器執(zhí)行所述程序時實現(xiàn)所述的方法。
28、根據(jù)本發(fā)明的第三方面,提供了一種計算機可讀存儲介質(zhì),其上存儲有計算機程序,所述程序被處理器執(zhí)行時實現(xiàn)所述的方法。
29、與現(xiàn)有技術(shù)相比,本發(fā)明具有以下有益效果:
30、1、消息映射機制是mfc的基礎(chǔ)技術(shù),基于mfc開發(fā)的軟件都存在著大量的消息映射代碼,轉(zhuǎn)換這些消息映射代碼會帶來大量的移植工作量。本發(fā)明以qt技術(shù)為基礎(chǔ),實現(xiàn)了mfc的消息映射機制,使得既有代碼的消息映射部分可以重用,在將layoutx(mfc程序)移植到qt時,可以保留layoutx代碼中與消息映射、消息響應(yīng)和消息發(fā)送相關(guān)的代碼,使得layoutx代碼移植時變動較小。
31、2、本發(fā)明的基于qt的消息映射機制保留了原mfc程序代碼的declare_message_map宏,原mfc程序頭文件中與on_messag相關(guān)的函數(shù)都可以保留和重用。
32、3、本發(fā)明的基于qt的消息映射機制保留了原mfc程序代碼的begin_message_map和end_message_map宏,僅對begin_message_map宏的第二個參數(shù)作了極小的修正:當(dāng)本類是消息映射最基類,或者說本類的父類是qt框架類時,第二個參數(shù)與第一個參數(shù)相同。與既有mfc程序代碼相比,僅一處修改,代碼重用度高。
33、4、本發(fā)明的基于qt的消息映射機制保留了原mfc程序代碼的on_message宏,這樣begin_message_map和end_message_map之間的大量on_message相關(guān)的代碼得以保留和重用。
34、5、本發(fā)明的基于qt的消息映射機制要求消息映射最基類在使用decalre_message_map的同時也使用wm_decl_wndmsg宏,新增的代碼量小,代碼重用度高。
35、6、本發(fā)明的基于qt的消息映射機制對于消息映射繼承類不要求使用wm_decl_wndmsg宏,這使得消息映射繼承類的頭文件差異性小,代碼重用度高。
36、7、本發(fā)明的基于qt的消息映射機制要求消息映射最基類在使用begin_message_map的同時也使用wm_impl_wndmsg宏,wm_impl_wndmsg的第二個參數(shù)為其c++基類,即qt框架中的類。
37、8、本發(fā)明的基于qt的消息映射機制對于消息映射繼承類不要求使用wm_impl_wndmsg宏,這使得消息映射繼承類的cpp文件差異性小,代碼重用度高。
38、9、本發(fā)明避免了用qt的信號槽機制去重構(gòu)既有應(yīng)用的on_message相關(guān)函數(shù)。qt的信號槽機制要求在運行期對信號、槽、信號對象、槽對象做顯示連接,連接的時機選擇要恰當(dāng)?;趒t的消息映射機制隱藏在代碼的宏結(jié)構(gòu)中,在進入main函數(shù)之前就建立了消息映射的結(jié)構(gòu),不需要關(guān)心連接的的時機,從而移植工作量小。
39、10、本發(fā)明的基于qt的消息映射機制使得既有程序與消息映射相關(guān)的代碼相同度非常高,基于mfc和qt維護兩套代碼、新增功能時都將會有極大的便捷性。