Re: [問題] Timer、Thread

看板Programming作者 (Analog Engineer)時間15年前 (2010/03/28 22:08), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串4/4 (看更多)
※ 引述《clarkman (涼雨)》之銘言: : 我在已經吃掉許多資源的程式下,想要定期接收RS232的資料 : 但是RS232要求必須在40ms接收2個Com Port的資料 : 處理速度卻慢了一些,無法在那麼短的時間處理 : 1. timer : 單線程,我使用timersetevent配合timeBeginPeriod, : 即使我調高他的Priority為最高,但他還是和程式是同一個thread : 因此,不是timer大量吃掉程式的資源,就是程式導致timer不夠快 : 目前是使用同一個timer一次抓兩個comport,所以一個comport傳送接收必須20ms內 : 2. thread : 目前作法是拉兩條thread,每個comport一個thread, : 但由於兩條的Priority都調最高,所以會導致彼此互搶資源 : 另外,使用thread不斷收資料,因此是寫了一個while,搭配sleep : sleep也是非常不準....即使使用了timeBeginPeriod,仍不夠快 : 補充:今天使用一條thread,一次收兩個comport的資料,效果好很多 : 不過使用ClearCommError判斷隊方的parity是否有切換成MARK : 總是得sleep 5ms以上才會很準,不然很容易判斷錯誤 : 常因為要sleep,導致抓資料的速度太慢 : 3. 多線程timer : 有查到.net有個system.threading.timer,但是程式是mfc,卻無法使用 : 很頭痛,不知道大家在處理上面有什麼更好得方法嗎? : 有人建議過使用mutli-process,不過又怕os不斷的搬資料,反而更慢 : 謝謝 最簡單的方法是用 OVERLAPPED IO, 兩個 COM PORT 都以 OVERLAPPED 的方式 開啟,然後用 WaitForMultipleObjects 來檢查對應的 Event object就可以知道有沒有 COM Port訊息進來. WaitForMultipleObjects 可以設 Timeout, 一次就可以解決三個 問題. 查查 MSDN 或 Advanced Windows 就有 Overlapped IO 的範例, Advanced Windows 有 新版叫 Windows via C/C++, 不過我覺得針對 Overlapped IO,舊版比較好讀. 對 COM Port的速度來說, Multi-process 裡 context-switch 佔用的時間其實 完全不用擔心. 甚至在主UI Message loop裡用 MsgWaitForMultipleObjects 取代前面提的 WaitForMultipleObjects, 直接在主Thread裡作完所有事應該也夠快才對. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.67.195.213

03/29 23:52, , 1F
把COMMTIMEOUTS搞好 也可以不需要管timeout
03/29 23:52, 1F

04/01 01:14, , 2F
LOOP ... 他很慢
04/01 01:14, 2F

04/01 01:14, , 3F
阿勒 推錯了
04/01 01:14, 3F
文章代碼(AID): #1BhsBJDV (Programming)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):
文章代碼(AID): #1BhsBJDV (Programming)