tag:C++,Observer,串口編程,隱藏窗口
/* Create By zyzx
* Created 2008-05-30
* Modified 2008-06-06
*/
??????? 在串口編程中,我們通常會(huì)碰到這樣的問(wèn)題:監(jiān)聽(tīng)端口的線程得到數(shù)據(jù)并將數(shù)據(jù)整理后,通知相應(yīng)了處理程式。。而這個(gè)過(guò)程中有兩個(gè)地方值得注意:1.監(jiān)聽(tīng)線程一次得到的數(shù)據(jù)一般是不完整的,如何拼湊成我們需要的格式是一個(gè)難點(diǎn);2.假設(shè)通過(guò)第一步,已經(jīng)得到完整的數(shù)據(jù)(C結(jié)構(gòu)或類)如何將這些信息告知UI主線程,并讓主線程做處理,而不會(huì)引起UI主線程的阻塞(表現(xiàn)出來(lái)的就是很卡)。
??????? 略過(guò)第一步(N(3)中再討論),第二步中最容易想到的方法是使用回調(diào)函數(shù),當(dāng)數(shù)據(jù)到達(dá)時(shí)通知(一般采用消息或事件機(jī)制防止阻塞)UI主線程去處理回調(diào)函數(shù)。
??????? 這樣做會(huì)帶來(lái)一些問(wèn)題:實(shí)現(xiàn)過(guò)程和UI界面耦合很緊;會(huì)增加很多全局變量,影響編程邏輯;線程之間對(duì)全局變量的存取順序(即線程通訊問(wèn)題)
?????? 為將端口讀寫(xiě)模塊與主應(yīng)用程序模塊分離,在編寫(xiě)端口讀寫(xiě)模塊的時(shí)候,我們不知到是誰(shuí)在使用,所以無(wú)法明確的指定哪個(gè)窗口對(duì)象獲得消息或事件。但為防止阻塞,實(shí)現(xiàn)消息或事件驅(qū)動(dòng),而又不影響主線程,我們可以由UI主線程創(chuàng)建一個(gè)隱藏的窗口(初始化時(shí)間)。這個(gè)窗口由端口讀寫(xiě)模塊來(lái)管理,COM的Read線程得到數(shù)據(jù)后并整理后通過(guò)消息或事件通知這個(gè)隱藏窗口(Socket編程中常用方法)。
?????? 如下圖:為整個(gè)串口處理過(guò)程。
注:圖中的數(shù)據(jù)結(jié)構(gòu)是地理信息結(jié)構(gòu),此處只為說(shuō)明串口通訊過(guò)程以及如何去組織這些結(jié)構(gòu)。(換成定義的指令結(jié)構(gòu),是一莫一樣的)
偶簡(jiǎn)單定義的地信結(jié)構(gòu)如下圖: