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 のようになったときにルーチンをトリガーする必要があります。 30分)

nud==1||2||3||4||5||6 の場合、システム クロックが HH:00:00 (1 時間) のようになると、ルーチンがトリガーされます。

あらゆるヒント、アイデア、リンクを歓迎します。前もってありがとう、ocaccy

4

3 に答える 3

2

「アプリはもう少し複雑でした。今では、nud_minusMinutes という最小値 1 と最大値 29 という別の numericUpDown があります。次の 1 時間で nud.Value ==0.5 かつ nud.Value>=1 の場合、次の 30 時間で 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 に答える
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 に答える
1

私が知っている唯一の方法は、毎秒起動するトリガーを設定し、値をチェックすることです (30 分と 0 秒です)。

于 2013-05-03T23:40:18.273 に答える