1

我有一个名为 nud 的 numericUpDown。nud=0.5,最小 0.5,最大 6,增量 0.5。这个 nud 是我的例程要执行的时间间隔。如果nud==0.5,我的例程每30分钟运行一次;如果 nud==1,则每 1 小时运行一次;nud==1.5,每 1 小时 30 分钟(90 分钟)运行一次,以此类推。但是,如果 nud nud==0.5||1.5||2.5||3.5||4.5||5.5,则应在系统时钟为 HH:00:00 或 HH:30:00 时触发例程。(每个半小时)

如果nud==1||2||3||4||5||6,则当系统时钟为HH:00:00(整点)时应触发例程。

欢迎每一个提示,想法,链接。提前感谢,ocaccy

4

3 回答 3

2

我〜想〜你想要这样的东西:

public partial class Form1 : Form
{

    private DateTime dt;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        SetInitialTimer();
    }

    private void SetInitialTimer()
    {
        // Set "dt" to the BEGINNING of the CURRENT hour:
        dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, 0, 0);

        switch (nud.Value.ToString())
        {
            case "0.5":
            case "1.5":
            case "2.5":
            case "3.5":
            case "4.5":
            case "5.5":
                // start at the NEXT 1/2 hour or top of the hour:
                if (DateTime.Now.Minute < 30)
                {
                    dt = dt.AddMinutes(30);
                }
                else
                {
                    dt = dt.AddHours(1);
                }
                break;

            default: // "1", "2", "3", "4", "5", "6"
                // start at the TOP of the NEXT hour:
                dt = dt.AddHours(1);
                break;

        }

        timer1.Interval = (int)dt.Subtract(DateTime.Now).TotalMilliseconds;
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Stop();

        // ... do something in here ...

        SetRecurringTimer();
    }

    private void SetRecurringTimer()
    {
        dt = dt.AddMinutes((double)(nud.Value * (decimal)60));
        timer1.Interval = (int)dt.Subtract(DateTime.Now).TotalMilliseconds;
        timer1.Start();
    }

}
于 2013-05-04T04:35:13.373 回答
2

“该应用程序有点复杂。现在我们有另一个名为 nud_minusMinutes 的 numericUpDown,最小值为 1,最大值为 29。timer1.Inteval = (int)dt.Subtract(DateTime.Now).TotalMilliseconds 将减去 nud_minusMinutes,如果 timer1.Interval如果 nud.Value ==0.5 并且 nud.Value>=1 在下一个完整小时内开始,则将大于 nud_minusMinutes.Value。

修改代码以解决新要求:

    private void SetRecurringTimer()
    {
        /*
         * The timer1.Inteval = (int)dt.Subtract(DateTime.Now).TotalMilliseconds will be minus nud_minusMinutes 
         * and if the timer1.Interval will be greater than nud_minusMinutes.Value 
         * start in the next half hour if nud.Value ==0.5 
         * and nud.Value>=1 in the next full hour that fits the timer1.Interval. 
         */

        dt = dt.AddMinutes((double)(nud.Value * (decimal)60));

        DateTime adjustedDT = dt.AddMinutes((int)(-1 * nud_minusMinutes.Value));
        int interval = (int)adjustedDT.Subtract(DateTime.Now).TotalMilliseconds;
        double adjustment = TimeSpan.FromMinutes((int)nud_minusMinutes.Value).TotalMilliseconds;

        if (interval > adjustment)
        {
            if (nud.Value == (decimal)0.5)
            {
                dt = dt.AddMinutes(30); // next 1/2 hour
            }
            else
            {
                // next full hour
                if (dt.Minute == 0)
                {
                    dt = dt.AddHours(1);
                }
                else
                {
                    dt = dt.AddMinutes(30);
                }
            }
            timer1.Interval = (int)dt.Subtract(DateTime.Now).TotalMilliseconds;
            timer1.Start();
        }
        else
        {
            timer1.Interval = (int)adjustedDT.Subtract(DateTime.Now).TotalMilliseconds;
            timer1.Start();
        }
    }
于 2013-05-08T12:58:45.050 回答
1

我知道这样做的唯一方法是有一个每秒触发一次的触发器并检查值(是第 30 分钟和第 0 秒)。

于 2013-05-03T23:40:18.273 回答