代码之家  ›  专栏  ›  技术社区  ›  IsmailS

在C计时器中完成小时后准确触发勾号事件

  •  4
  • IsmailS  · 技术社区  · 14 年前

    我希望滴答事件在每小时结束后立即触发。例如,它应该在 8 am 然后在 9 am 然后在 10 am 等。 很简单,我需要设置 Interval 3600000 .

    这里的问题是我该如何确定何时启动计时器? 我正在创建一个工具,它将运行在系统托盘的时候,用户将登录。

    5 回复  |  直到 10 年前
        1
  •  10
  •   VVS    14 年前

    请不要创建只会浪费内存的程序。这就是Windows的任务调度程序的用途。从这样的任务开始,每小时运行一次程序。

    http://msdn.microsoft.com/en-us/library/aa384006%28v=VS.85%29.aspx

    下面是一个示例:

    • 转到“开始”->“程序”->“附件”->“计划任务”。
    • 在右侧,单击“添加任务…”。
    • 选择可执行文件。
    • 转到触发器选项卡。
    • 使用以下选择创建触发器:

    .

    Run Daily 
    Start today at 8:00 am
    Repeat every 1 Hour
    

    很抱歉,我不能提供任何截图,因为我运行的是德国版的Windows7。

        2
  •  4
  •   Saeed Amiri    14 年前

    可能下面的代码是错误的,但想法是这样的:

        public void InitTimer()
        {
            DateTime time = DateTime.Now;
            int second = time.Second;
            int minute = time.Minute;
            if (second != 0)
            {
                minute = minute > 0 ? minute-- : 59;
            }
    
            if (minute == 0 && second == 0)
            {
                // DoAction: in this function also set your timer interval to 3600000
            }
            else
            {
                TimeSpan span = new TimeSpan(0, 60 - minute, 60 - second);
                timer.Interval = (int) span.TotalMilliseconds - 100; 
                timer.Tick += new EventHandler(timer_Tick);
                timer.Start();
            }
        }
    
        void timer_Tick(object sender, EventArgs e)
        {
            timer.Interval = 3600000;
            // DoAction
        }
    

    编辑: 正如@smirkingman所提供的,由于项目启动和运行此应用程序的延迟,我删除了一些毫秒: timer.Interval = (int) span.TotalMilliseconds - 100;

        3
  •  1
  •   SubniC    14 年前

    我认为如果你设置一个定时器,比如说每分钟,就可以比较容易,这个计时器可以检查系统时钟,当所需时间小于或等于系统时间时,你可以只运行动作(在这个例子中,最大误差为1分钟)。

    你可以改进它,如果你使计时器间隔定数,例如,如果你检查的时间,仍然是半小时,你可以设置间隔为15分钟,下一次时间你减少到5分钟,以此类推,直到你检查时钟每秒一次,例如。

    高温高压

        4
  •  1
  •   Lee    13 年前

    我就是这样做的。滴答声事件每20秒触发一次。只需将minutes==“xxx”更改为您希望事件触发的任何时间。如果需要将事件分散到数小时内,只需延长间隔计时器简单有效。

    private void timer1_Tick(object sender, EventArgs e)
        {
          DateTime Time = DateTime.Now;
              int minutes = Time.Minute;
    
                if (minutes == 00)  //FIRE ON THE HOUR
                    { DO THIS  }
    
                if (minutes == 15)  //FIRE ON 1/4 HOUR
                    {  DO THIS }
    
                if (minutes == 30)  //FIRE ON 1/2 HOUR
                    { DO THIS }
    
                if (minutes == 45)  //FIRE ON 3/4 HOUR
                    { DO THIS }
        }
    
        5
  •  0
  •   Mike Caron    14 年前

    与其每小时启动一次计时器,不如每分钟启动一次计时器,并检查时间是否到了。

    唯一的问题是最坏的延迟是59秒。如果你需要它开火 确切地 在上班时间(上午10点整),你可能需要在第一时间调整一下时间间隔,这样你就可以排队了。