Re: [問題] Timer、Thread
看板Programming作者charleshu (Analog Engineer)時間15年前 (2010/03/28 22:08)推噓1(1推 0噓 2→)留言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
03/29 23:52, 1F
推
04/01 01:14, , 2F
04/01 01:14, 2F
→
04/01 01:14, , 3F
04/01 01:14, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章