作者charleshu (Analog Engineer)
看板Programming
标题Re: [问题] Timer、Thread
时间Sun Mar 28 22:08:16 2010
※ 引述《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
1F:→ fissh:把COMMTIMEOUTS搞好 也可以不需要管timeout 61.229.44.210 03/29 23:52
2F:推 wowtiger:LOOP ... 他很慢 115.43.38.106 04/01 01:14
3F:→ wowtiger:阿勒 推错了 115.43.38.106 04/01 01:14