本週,將之前發表的文章串列埠操作的非同步實現應用到專案中的rfid、條碼、列印等串列埠應用時,發現了一些問題:
1. 在使用串列埠前,應清除串列埠中無用的資料;
2. 從串列埠讀取資料方法的改進;
3. 資料的解析
4. 傳送
5. 資源占用
6. 退出和資源的釋放
一.在使用串列埠前,應清除串列埠中無用的資料;
一種方法是在commhandler執行緒迴圈進入前清除無用的資料;一種方法是在開啟串列埠時清除無用的資料;由於commhandler執行緒的啟動時間不確定,在commhandler中清除可能會造成有用的無用的資料一起被清除了;
二.從串列埠讀取資料方法的改進;
之前的方法是有資料,就讀取並壓入佇列中,然後通知上層,資料來了;這種做法有乙個弊端,就是一段完整的資料可能會被分成多段;改進的辦法就是在commhandler中加迴圈,直到沒有資料後,表示收到了一段完整的資料後,再通知上層;
這種處理方法有侷限性,至少對於有大量連續的資料接收的情況就不適合;對於我的應用,主要是傳送,加少量的接收,就很有效;
三.資料的解析
從串列埠接收到的資料要被上層解析,不同的應用,協議不同,這部分工作應放在上層來做,對於一串資料,解析一般都是從中提取首尾標誌或者是特殊的字元,用佇列來處理這種情況就非常適合;
如果要處理的協議較為複雜,還可以採用資料處理和檢視分開的形式,這樣,結構清晰,資料處理部分還可以直接打成庫;我在處理條碼symbol se955協議時,就是這樣做的;
四.傳送
傳送的時機:通過串列埠傳送資料時,要選擇合適的時機,否則,可能會造成死鎖;
傳送介面的變化:將傳送方法由send(byte)改為send(byte,offset,len),這樣的好處在於可以傳送乙個位元組流中的一段資料;
五.資源占用
對於串列埠操作時,沒有其它資料處理的情況,比如條碼、rfid應用,可以允許queueeventhandler一直迴圈占用處理器資源,而對於在串列埠接收傳送資料的同時,還要同時做大量資料處理的情況,比如列印,queueeventhandler一直迴圈查詢就太浪費資源了;
處理的辦法就是在queueeventhandler中加入wait,然後通過外部呼叫來notify;
六.退出和資源的釋放
為了能夠合適地釋放資源,在commhandler和queueeventhandler中加入了標誌位,在commhandler的兩次wait之間加入了標誌位判別,以避免退出時,notify後再次被阻塞;還要清除串列埠中的資料,以便於下次使用;在串列埠關閉和commhandler和queueeventhandler兩個執行緒間,要避免關閉時產生異常;
檔案非同步操作的實現
非同步操作可以使我們的程式獲得更優的效能,特別是對大檔案進行處理時,這一點相信大家都知道。這裡我寫了乙個示例。希望能給大家乙個幫助。using system.io using system.threading public class form2 system.windows.forms.form ...
C 非同步資料接收串列埠操作類
使用c 呼叫傳統32位api實現串列埠操作,整個結構特別的簡單。接收資料只需要定義資料接收事件即可。using system using system.runtime.interopservices namespace ibms.tool.io this.recvdata recvdata 返回接收...
C 非同步資料接收串列埠操作類
使用c 呼叫傳統32位api實現串列埠操作,整個結構特別的簡單。接收資料只需要定義資料接收事件即可。上傳源 我不會,需要源 的請與我 dyj057 gmail.聯絡。你也可以教我怎麼上傳源 using system using system.runtime.interopservices names...