服务器计时器与 Windows 计时器

原创 2003年06月22日 13:35:00
说明:此文大部分内容摘自MSDN,本人只是做了一点整理。如果有什么异议,一切以MSDN为准。

一、引言
    在 Visual Studio .NET 中有两种计时器控件——基于服务器的计时器和标准的基于 Windows 的计时器。
基于 Windows 的计时器为在 Windows 窗体应用程序中使用而进行了优化,基于服务器的计时器是传统的计时
器为了在服务器环境上运行而优化后的更新版本。
 
二、两种不同的计时器有什么区别呢?
    在 Win32 体系结构中有两种类型的线程:UI 线程和辅助线程。UI 线程绝大多数时间处于空闲状态,等待
消息循环中的消息到来。一旦接收到消息,它们就进行处理并等待下一个消息到来。另外,辅助线程用来执
行后台处理而且不使用消息循环。虽然 Windows 计时器和基于服务器的计时器运行时都使用 Interval 属性,
但它们的设计用途是不同的(这一点可由它们对线程的处理方式来证明): 

    Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。 Windows 计时器的精度限定为 55
 毫秒。这些传统计时器要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封
送到另一个线程。对于 COM 组件来说,这样会降低性能。   

    基于服务器的计时器是为在多线程环境下与辅助线程一起使用而设计的。由于它们使用不同的体系结构,因
此基于服务器的计时器可能比 Windows 计时器精确得多。服务器计时器可以在线程之间移动来处理引发的事件。 

    基于服务器的 Timer 是为在多线程环境中用于辅助线程而设计的。服务器计时器可以在线程间移动来处理引
发的 Elapsed 事件,这样就可以比 Windows 计时器更精确地按时引发事件。有关基于服务器的计时器的更多信
息,请参阅基于服务器的计时器介绍。

三、使用示例
这里给出了两种计时器的示例,以便大家参考使用。
1、服务器计时器使用示例

//using System.Timers; 
public class Timer1
 {
 
     public static void Main()
     {
         System.Timers.Timer aTimer = new System.Timers.Timer();
         //设置事件处理句柄,此处为OnTimedEvent方法:
         aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
         aTimer.Interval=5000;//设置间隔时间为5秒
         aTimer.AutoReset=true;
         /*
          *注意   当 AutoReset 设置为 false 时,Timer 只在第一个 Interval 
          *过后引发一次 Elapsed 事件。若要保持以 Interval 时间间隔引发 
          *Elapsed 事件,请将 AutoReset 设置为 true。
          */
         aTimer.Enabled=true;//计时开始,此处也可以用aTimer.Start();
 
         Console.WriteLine("Press /'q/' to quit the sample.");
         while(Console.Read()!='q');
         aTimer.Enabled=false;//计时结束,此处也可以用aTimer.Stop();
     }
 
     //这里就是 Elapsed 事件发生时所调用的方法:
     public static void OnTimedEvent(object source, ElapsedEventArgs e)
     {
         Console.WriteLine("Hello World!");
     }
 }

2、Windows 计时器使用示例

    Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。它要求用户代码有一个可用的 UI 
消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。


//using System.Windows.Forms; 
public class Class1 
{
    static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
    static int alarmCounter = 1;
    static bool exitFlag = false;
 
    // 在时间到达的时候就运行下面的方法:
    private static void TimerEventProcessor(Object myObject,
                                            EventArgs myEventArgs)
    {
       myTimer.Stop();
 
       // 显示一个对话框,询问是否继续运行计时器
       if(MessageBox.Show("Continue running?", "Count is: " + alarmCounter, 
          MessageBoxButtons.YesNo) == DialogResult.Yes) 
       {
          // 重新启动计时器
          alarmCounter +=1;
          myTimer.Enabled = true;
       }
       else 
       {
          //关闭计时器
          exitFlag = true;
       }
    }
 
    public static int Main() 
    {
       /* 设置事件处理句柄 ,这里的Tick与服务器计时其中的Elapsed相对应*/
       myTimer.Tick += new EventHandler(TimerEventProcessor);
 
       myTimer.Interval = 5000;// 初始化计时器
       myTimer.Start();
 
       // 开始运行计时器
       while(exitFlag == false)  
       {
          //延迟一段时间
          Application.DoEvents();
       }
       return 0;
    }
 }

服务器计时器与 Windows 计时器

  • zgqtxwd
  • zgqtxwd
  • 2008年04月24日 11:54
  • 82

服务器开发过程中关于计时器的处理

简介游戏服务器开发过程中经常会需要使用计时器来触发相应的事件,这篇文章主要是将什么时候需要使用计时器,什么不是不需要使用计时器,以及对于用一个例子来说明一些关于计时器的处理。需求描述我需要开发一个活动...
  • suzuiyue
  • suzuiyue
  • 2017年04月29日 16:10
  • 431

服务器计时器、Windows 计时器和线程计时器

基于 Windows 的计时器针对在 Windows 窗体应用程序中使用而进行了优化。基于服务器的计时器是传统的计时器为了在服务器环境上运行而优化后的更新版本。线程计时器是一种简单的、轻量级计时器,它...
  • wojiaosha123
  • wojiaosha123
  • 2009年09月04日 09:54
  • 463

MFC Windows程序设计--计时器和空闲处理

CWnd::SetTimer CWnd::KillTimer// 两种定时器机制 1.给指定窗口发WM_TIMER。 2.调用应用定义的回调函数。计时器消息不会积压在消息队列中。SetTimer...
  • x13262608581
  • x13262608581
  • 2017年04月17日 07:51
  • 379

高精度计时器QueryPerformanceCounter正确的打开方式(windows环境下)

引言 游戏程序中有很多需要用到时间的地方,往往会通过windows API来获取时间。先前写过一篇文章是关于时间同步的:网络游戏中的(低精度)时间同步,当需求更高精度的时间同步时,就需要QueryPe...
  • u010832643
  • u010832643
  • 2015年03月27日 10:12
  • 2452

180112 逆向-Windows消息机制(定时计时器消息)

1625-5 王子昂 总结《2018年1月12日》 【连续第469天总结】 A. Windows消息系统-定时计数器消息 B.概述通过SetTimer函数为应用程序分配一个计时器 SetTim...
  • whklhhhh
  • whklhhhh
  • 2018年01月14日 01:04
  • 33

利用Windows API实现精确计时器

class CPreciseTimer { public: CPreciseTimer(unsigned int, ITimerObserver*); void Start(); void Pa...
  • kingbird_Wang
  • kingbird_Wang
  • 2016年09月22日 22:42
  • 868

计时器和回调函数

mfc计时器直接使用SetTimer(),原型如下: UINT_PTR SetTimer( UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器 ...
  • lfzzlx
  • lfzzlx
  • 2015年06月25日 21:45
  • 557

js 秒表计时器(开始,停止,清零)

var c=0 var t function timedCount()  {  document.getElementById('txt').value=c  c=c+1  t=s...
  • liufengfengcoc
  • liufengfengcoc
  • 2015年08月16日 16:25
  • 7720

javascript循环计时器

做了一个循环计时器 clearInterval var setid; var time; ...
  • qq_33665647
  • qq_33665647
  • 2016年07月31日 19:07
  • 774
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:服务器计时器与 Windows 计时器
举报原因:
原因补充:

(最多只允许输入30个字)