czg1411 发表于 2014-12-2 10:30:50

Windows有高精度定时器可以到1ms,查看timeSetEvent()函数

nongxiaoming 发表于 2014-12-2 10:52:15

kinsno 发表于 2014-12-2 08:38
你这个方法,基本搞定了,可是为啥XP下定时效果子不一样的呢,XP下面它的延时为31-32MS的延时了呢?
悄悄 ...

我是看了上面发现你说发字幕,还以为你是发字幕的。我的意思是你直接开个线程去轮询IMediaPosition接口里就有CurrentPosition,类似于这段代码,以视频的时间轴作为基准,这样是不是可以满足?这样可以做得和视频同步,即使中间播放卡了还是同步的。

kinsno 发表于 2014-12-2 11:12:18

nongxiaoming 发表于 2014-12-2 10:52
我是看了上面发现你说发字幕,还以为你是发字幕的。我的意思是你直接开个线程去轮询IMediaPosition接口里 ...

妥了,先尝试一下!

nongxiaoming 发表于 2014-12-2 11:27:39

kinsno 发表于 2014-12-2 11:12
妥了,先尝试一下!

还有你说的这个网友提供的这个代码在XP上不准的原因其实是你系统没有安装chrome浏览器啊。其实这样去轮询这个时间也是不准的,在win7下也是一样。在sleep(1)的时候线程让出,这时候要再次被唤醒需要下一个系统调度tick,而windows默认就是15.625ms一个tick的,也就是每秒64个tick,所以再次激活就差很大了。而chrome浏览器运行的时候,会把系统tick改成1000,这时候就准了,因为系统tick被改成了1ms一个。我在我的电脑上验证过,运行chrome再运行这段代码和不运行chrome完全是两个不同的结果。

kinsno 发表于 2014-12-2 11:58:32

nongxiaoming 发表于 2014-12-2 11:27
还有你说的这个网友提供的这个代码在XP上不准的原因其实是你系统没有安装chrome浏览器啊。其实这样去轮询 ...

小农你这个“定时不准和谷歌浏览器有关”说法有问题啊;
XP上面确实没装谷歌浏览器,时间在30MS左右;
但我在WIN7上面运行,确实是25MS间隔,但我的WIN7上面也没装谷歌浏览器啊;

god-father 发表于 2014-12-2 12:40:17

kinsno 发表于 2014-12-2 11:58
小农你这个“定时不准和谷歌浏览器有关”说法有问题啊;
XP上面确实没装谷歌浏览器,时间在30MS左右;
但 ...

想过了,你用单片机作一个25MS的定时器,简单一点用PC的串口(也可以用信号脚控制)。

god-father 发表于 2014-12-2 12:40:57

这样可以跟操作系统无关,哪怕你用在LINUX

老谷 发表于 2014-12-2 13:46:37

帖子内容看了一遍,很受启发

gwnpeter 发表于 2014-12-2 14:08:16

kinsno 发表于 2014-12-2 09:58
用你那个,关键是我不晓得把把串口发送放在哪个地方啊,是不是放在我上面所说的那个地方啊?那样子的话, ...

是那个地方不错,
不过最好还是封装一下,串口的初始化放在while循环之前,串口的关闭放在wihle循环之后,while里面发送一个event,你就可以捕获事件了,另外while的循环条件使用一个变量,通过这变量来控制while的退出,从而造成线程的正确退出。
封装里面有需要有:start()函数        ---->启动线程,thread。start 的时候是可以传递一个参数的,可以通过这个参数传递串口的端口号,文件名等
封装里面有需要有:stop()函数        ---->关闭线程,修改while循环的条件,造成线程正常退出。最好不要直接杀死线程,这样可能会造成资源没有正确释放....第二次启动线程就出麻烦了

这些都涉及到多线程编程,有些技巧还是要慢慢琢磨的.......

gwnpeter 发表于 2014-12-2 14:19:33

kinsno 发表于 2014-12-2 11:58
小农你这个“定时不准和谷歌浏览器有关”说法有问题啊;
XP上面确实没装谷歌浏览器,时间在30MS左右;
但 ...

win7 sleep(1) 我这里出来的效果确实是1ms的,难不到是win7的默认tick >= 1000,xp默认的tick = 64   ?

kinsno 发表于 2014-12-2 14:23:02

gwnpeter 发表于 2014-12-2 14:19
win7 sleep(1) 我这里出来的效果确实是1ms的,难不到是win7的默认tick >= 1000,xp默认的tick = 64    ...

不知道,我这里XP电脑上用,基本上是在31-32MS左右的;闹不明白啊;

nongxiaoming 发表于 2014-12-2 14:35:21

gwnpeter 发表于 2014-12-2 14:19
win7 sleep(1) 我这里出来的效果确实是1ms的,难不到是win7的默认tick >= 1000,xp默认的tick = 64    ...

但我这边win7测试确实是这样呢,chrome开起来就准,关闭后就不准了。开起来后还是蛮准的,关闭后就不是了。我用的win7 64位旗舰版,下面是我的截图:

网友给的那段代码有些语法问题,我修了一下,我测试用的代码如下:
   static void Main(string[] args)
      {
            DateTime ot = System.DateTime.Now;
            TimeSpan ts;
            int t1;
            int t2=0;
            do
            {
                ts = System.DateTime.Now - ot;
                t1 = (int)ts.TotalMilliseconds;
                t1 = t1 / 25;
                if (t1 != t2)
                {
                  t2 = t1;
                  Console.WriteLine("line:" + t1.ToString() + " at " + ts.TotalMilliseconds.ToString());
                }
                System.Threading.Thread.Sleep(1);
            } while (true);
      }

gwnpeter 发表于 2014-12-3 21:56:27

nongxiaoming 发表于 2014-12-2 14:35
但我这边win7测试确实是这样呢,chrome开起来就准,关闭后就不准了。开起来后还是蛮准的,关闭后就不是了 ...

还有这样................我没有用chrome............
页: 1 [2]
查看完整版本: C#如何实际25MS的精确定时