从控件箱中拖拽的Timer控件,interval设了50,然后在每个Tick事件中累加了0.05s,最后的记时结果比XP系统右下角的记时慢很多,差不多一分钟慢10几秒,我知道这可能是主进程阻塞的问题,但是怎么解决呢(我要精确一点的Timer)?高手快点给我解决吧,deadline到了!!

解决方案 »

  1.   

    用这个,封装好的异步处理的Timer!
    http://www.codeproject.com/KB/dotnet/ABTransClockArticle.aspx上面的源代码,需要你用email注册为网站用户后,才能下载!
      

  2.   


    回忆一下,那个地方的资料跟你说过控件箱里的Timer控件应该满足像你这样的行为?这个控件就跟你在Button上按按钮一样,是在windows消息泵机制中跟成千上万的消息一起排队的,并且当同一个timer控件的到时消息累积很多时windows还会主动丢弃一些消息。给你一个忠告,深入一点去理解控件。你要的那种Timer不可能再界面层的控件中去寻找,至少你也该从System.Threading里去去找呀!
      

  3.   

    界面层的控件是用来实现界面显示的,因此界面层的timer是处理例如动画的表层之类的东西的,而不是进行底层控制计算的。不要只知道使用控件来编程。
      

  4.   

    引用system.timer
    自己看看帮助文档。
     aTimer = new System.Timers.Timer(10000);        // Hook up the event handler for the Elapsed event.
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);        // Only raise the event the first time Interval elapses.
            aTimer.AutoReset = false;
            aTimer.Enabled = true;        Console.WriteLine("Press the Enter key to exit the program.");
            Console.ReadLine();        // If the timer is declared in a long-running method, use
            // KeepAlive to prevent garbage collection from occurring
            // before the method ends.
            //GC.KeepAlive(aTimer);
        }    // Specify what you want to happen when the Elapsed event is 
        // raised.
        private static void OnTimedEvent(object source, ElapsedEventArgs e) 
        {
            Console.WriteLine("Hello World!");
        }
    }
    aa为事件。构造函数里面的数据为时间。也就是每10000毫秒执行一次AA事件。
      

  5.   

    Windows 计时器是为单线程环境设计的
    基于Windows消息循环,用事件方式触发
    具体就和内存、CPU的运行有关了,有10毫秒左右的浮动
      

  6.   

    用System.Timers.Timer更精确
    在 Win32 体系结构中有两种类型的线程:UI 线程和辅助线程。UI 线程绝大多数时间处于空闲状态,等待消息循环中的消息到来。一旦接收到消息,它们就进行处理并等待下一个消息到来。另外,辅助线程用来执行后台处理而且不使用消息循环。Windows 计时器和基于服务器的计时器在运行时都使用 Interval 属性。线程计时器的时间间隔在 Timer 构造函数中设置。计时器的设计目的各不相同,它们的线程处理明确地指出了这一点:  
    Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。Windows 计时器的精度限定为 55 毫秒。这些传统计时器要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。对于 COM 组件来说,会降低性能。
      

  7.   

    不管用哪个Timer,用Time中累积时间一定是错的。解决方法:
    不累积,而是用Timer中用DateTime.Now来获得当前时间。
      

  8.   

    好象三种TImer的计时精度都不是很准,将Tick周期定为100毫秒,都是110毫秒。靠每个Tick事件为某个变量增加一定的数值来计时不行。就得不断地获取系统时间。
      

  9.   

    你说的是Form.Timer吧,用多线程吧.
      

  10.   

    各位高手:用System.Timer的时候,涉及到跨线程访问窗体的控件,报异常这种情况一般怎么解决?
      

  11.   

    用System.Timers.Timer吧 
    Timer本身就是一个线程
    你说的是窗体的Timer控件,跟这个是不一样的
      

  12.   

    我的意思就是System.Timers.Timer,