作者ghostx2 (Ghostx2)
看板C_Sharp
标题[问题] 如何获得稳定的Timer
时间Sat May 28 11:47:27 2016
为了获得1ms cycle time
目前使用两个方式达成
第一个方式使用Thread搭配while回圈
使用Stopwatc跟SpinWait、Thread.Sleep(1)搭配
另一个方式使用media timer(timeSetEvent)
两个方式目前都可以得到1ms cycle time
但只要有新的执行绪建立
当下会影响目前已存在的timer
这个现象据我测试强制GC也会
但不同的电脑受到影响的程度不一
我目前使用Acer VN7就很容易受到影响
公司的工业电脑影响程度较低
但也还没达到稳定程度
提高程式即时性也没什麽用
还有什麽招可试吗?
感谢
目前已参考网路文章标题如下
KB-测试Thread.Sleep的精确度
KB-Thread.Sleep, 别赖床!
Timer surprises, and how to avoid them
Priority-induced starvation: Why Sleep(1) is better than Sleep(0) and the
Windows balance set manager
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.41.244.219
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1464407249.A.F24.html
1F:→ m339606: 程式的方式不可能有准确的计时,CPU的时脉等等都有影响 05/28 13:09
2F:→ m339606: 例如我的case是每一秒都要tick,但是一定会有0~100ms的误 05/28 13:10
3F:→ m339606: 差,与CPU时脉还有负载有关 05/28 13:10
4F:→ m339606: 1ms计时的误差会更严重,建议要精准的话走电路设计触发会 05/28 13:12
5F:→ m339606: 好些 05/28 13:12
6F:→ Litfal: 用while(isOk()) Thread.SpinWait(100); 精度会比Sleep高 05/28 21:47
7F:→ Litfal: 缺点是CPU占用率会比较高,而且要达到lms的精度也可能不够 05/28 21:49
8F:→ Litfal: 让执行续忙碌(空转)会让它"比较不容易"被context switch 05/28 22:16
9F:→ Litfal: 而Sleep则会主动让出控制权,就会发生switch。 05/28 22:18
10F:→ Litfal: 只要发生switch,什麽时候再轮到你是不可控的,所以计时精 05/28 22:19
11F:→ Litfal: 度高不了。 05/28 22:20
12F:→ m339606: 帮楼上补充,要看os层是不是允许你持续的吃cpu时间,否则 05/29 00:24
13F:→ m339606: 一样会被switch,如果要准确1ms真心建议往电路ㄑ比较好 05/29 00:24
14F:推 zel: Thread.sleep 不是以15ms计算吗? 05/29 03:32
15F:推 zel: 试试看拉高处理序与执行续的层级,然後锁定在单一核心执行试 05/29 03:35
16F:→ zel: 试看? 05/29 03:35
17F:推 zel: 但要完全刚好是1ms很难,毕竟(1)记数最小单位通常是1个tick i 05/29 03:40
18F:→ zel: nterval,1ms不是它的整数倍(2)执行排程的最高层级是留给wind 05/29 03:40
19F:→ zel: ows自己用 05/29 03:40
20F:推 zel: 要不就换Win Embedded,印象中有提供api,或是装RTX(要从比 05/29 03:43
21F:→ zel: 较底层开始写不是很了解,待板上高手补充) 05/29 03:43
22F:推 zel: 另外建议时间计数参考kernel的QueryPerformanceCounter 05/29 03:58
23F:→ ghostx2: Thread.Sleep能不能到1ms要看硬体能不能支援 05/29 10:33
24F:→ ghostx2: 至少我测了4台电脑都可以, 目前我回圈有再尝试用 05/29 10:35
25F:→ ghostx2: Thread加while另一个用media timer 05/29 10:35
26F:→ ghostx2: 两者都还是会受到Context Switch影响, 有时候1ms变100ms 05/29 10:36
27F:→ ghostx2: 我知道没法完全稳定到1ms,只是在找方法把这影响压到最低 05/29 10:37
28F:→ ghostx2: 另外RTX API要买SDK授权 05/29 10:40
29F:→ ghostx2: 测试了指定核心,这个也没法对抗Context Switch影响 05/29 11:03
30F:推 largesperm: 这样的需求不是应该买专业 real time 软体吗 05/29 14:08
31F:→ largesperm: INtime 这类的软体 05/29 14:08
32F:→ largesperm: 在 windows 要做到 real time 没想像中的简单啊 05/29 14:08