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