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