串列埠操作的非同步實現的完善

2021-05-12 18:49:46 字數 1394 閱讀 9441

本週,將之前發表的文章串列埠操作的非同步實現應用到專案中的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...