4

簡単なストップウォッチプログラムを書きたいのですが、次のコードで動作させることができます

    public Form1()
    {
        InitializeComponent();
    }
    System.Diagnostics.Stopwatch ss = new System.Diagnostics.Stopwatch { };
    private void button1_Click(object sender, EventArgs e)
    {
        if (button1.Text == "Start")
        {
            button1.Text = "Stop";

            ss.Start();
            timer1.Enabled = true;

        }
        else
        {
            button1.Text = "Start";

            ss.Stop();
            timer1.Enabled = false;

        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {


            int hrs = ss.Elapsed.Hours, mins = ss.Elapsed.Minutes, secs = ss.Elapsed.Seconds;
            label1.Text = hrs + ":";
            if (mins < 10)
                label1.Text += "0" + mins + ":";
            else
                label1.Text += mins + ":";
            if (secs < 10)
                label1.Text += "0" + secs;
            else
                label1.Text += secs;


    }

    private void button2_Click(object sender, EventArgs e)
    {
        ss.Reset();
       button1.Text= "Start";
       timer1.Enabled = true;

    }

次に、このストップウォッチのカスタム開始時刻を設定します。たとえば、0:00:00からカウントアップを開始せず、0:45:00から開始するようにします。どうすればよいですか。ありがとうございます。

4

5 に答える 5

19

Stopwatch には、カスタムの開始時刻を設定できるメソッドやプロパティはありません。

Stopwatch をサブクラス化し、ElapsedMilliseconds と ElapsedTicks をオーバーライドして、開始時間のオフセットを調整できます。

    public class MyStopwatch : Stopwatch
    {
        public TimeSpan StartOffset { get; private set; }

        public MyStopwatch(TimeSpan startOffset)
        {
            StartOffset = startOffset;
        }

        public new long ElapsedMilliseconds
        {
            get
            {
                return base.ElapsedMilliseconds + (long)StartOffset.TotalMilliseconds;
            }
        }

        public new long ElapsedTicks
        {
            get
            {
                return base.ElapsedTicks + StartOffset.Ticks;
            }
        }
    }
于 2012-07-27T04:38:21.103 に答える
6

例に従って、初期値が 45 分のSystem.TimeSpanの新しいインスタンスを作成します。ストップウォッチの値をTimeSpan.Add Methodに追加するよりも。便利なことに、Stopwatch.Elapsedは既に System.TimeSpan 型になっています。

文字列フォーマッタを使用して、書式設定された時間をラベルに出力します。他の答えの1つは、それを行う方法をすでに示していると思います。それ以外の場合は、TimeSpan インスタンスのTimeSpan.ToString メソッド (文字列)をフォーマットする方法、またはカスタム フォーマッタを使用する方法に関する参考資料をいくつか示します。

var offsetTimeSpan = new System.TimeSpan(0,45,0).Add(ss.Elapsed)
于 2012-07-27T04:49:04.257 に答える
0

オフセットは固定ですか、それとも可変ですか?

いずれの場合も、クラスのメンバー変数またはconstとして使用し、追加するだけです。

private TimeSpan offset = TimeSpan.FromSeconds(45);

次に、ティックを変更して含めます。

var combined = ss.Elapsed + offset;
int hrs = combined.Hours, mins = combined.Minutes, secs = combined.Seconds;
于 2012-07-27T05:16:42.190 に答える
0

開始時間を変更することはできませんが、Stop() の後で変更することはできます。

簡単な Google 検索: http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.start(v=vs.90).aspx

マイナーな変更:

class Program
{
    static void Main(string[] args)
    {            
        System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
        
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;
        
        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes + 45 , ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);
    }
}

結果:

実行時間 00:45:10.00

何かキーを押すと続行します 。. .

あなたの側でもう少し調査することは、開発者として計り知れないほど役立つでしょう。

于 2012-07-27T04:42:43.183 に答える