【C#】簡単なストップウォッチを作ろう Final
Stop状態のときに時計を表示するようにする
最後はStop状態のときに時計を表示するようにすればストップウォッチの完成となります。
- 時計表示用のBackgroundWorker(bw2)を作ります。
- Stopを押した時にbw2が止まるようにコードを書きます。
- (バグがあったので(Pause中にStop押した時)こっそり修正します)
こうする事で「文書化」で定義したものとは少し異なりますがストップウォッチの完成となります。(こういう場合は、文書のほうを書き直したほうが早い場合が多いです)
※コードが長くなるので書いてませんが、実際にはコメントをたくさん書くようにしましょう。
public partial class Form1 : Form { public Form1() { InitializeComponent(); } DateTime now; DateTime startTime; BackgroundWorker bw; BackgroundWorker bw2; TimeSpan ts; bool isStoped = false; private void Form1_Load(object sender, EventArgs e) { ts = new TimeSpan(0); bw = new BackgroundWorker(); bw2 = new BackgroundWorker(); bw.DoWork += Bw_DoWork; bw2.DoWork += Bw2_DoWork; bw.RunWorkerCompleted += Bw_RunWorkerCompleted; bw2.RunWorkerCompleted += Bw2_RunWorkerCompleted; bw.WorkerSupportsCancellation = true; bw2.WorkerSupportsCancellation = true; bw2.RunWorkerAsync(); } private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { button1.Text = "Start"; if (isStoped) { ts = new TimeSpan(0); label1.Text = "00:00:00.000"; dataGridView1.Rows.Clear(); tsl.Clear(); isStoped = false; bw2.RunWorkerAsync(); } } private void Bw2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { startTime = DateTime.Now - ts; bw.RunWorkerAsync(); button1.Text = "Pause"; } private void button1_Click(object sender, EventArgs e) { if (button1.Text == "Start") { if (bw2.IsBusy) { bw2.CancelAsync(); } else { startTime = DateTime.Now - ts; bw.RunWorkerAsync(); button1.Text = "Pause"; } } else { bw.CancelAsync(); button1.Text = "Start"; } } private void button2_Click(object sender, EventArgs e) { isStoped = true; if (bw.IsBusy) { bw.CancelAsync(); } else { ts = new TimeSpan(0); label1.Text = "00:00:00.000"; dataGridView1.Rows.Clear(); tsl.Clear(); isStoped = false; if (!bw2.IsBusy) bw2.RunWorkerAsync(); } } private void Bw_DoWork(object sender, DoWorkEventArgs e) { while (!bw.CancellationPending) { now = DateTime.Now; ts = now - startTime; try { Invoke((MethodInvoker)delegate () { label1.Text = String.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds); }); } catch (Exception ex) { } } } private void Bw2_DoWork(object sender, DoWorkEventArgs e) { while (!bw2.CancellationPending) { now = DateTime.Now; try { Invoke((MethodInvoker)delegate () { label1.Text = String.Format("{0:D2}:{1:D2}:{2:D2}", now.Hour, now.Minute, now.Second, now.Millisecond); }); } catch (Exception ex) { } } } List<TimeSpan> tsl = new List<TimeSpan>(); private void button3_Click(object sender, EventArgs e) { if (!bw.IsBusy) return; tsl.Add(ts); TimeSpan tmp = new TimeSpan(0); if (tsl.Count <= 1) { tmp = tsl[tsl.Count - 1]; } else { tmp = tsl[tsl.Count - 1]- tsl[tsl.Count - 2]; } DataGridViewTextBoxCell jikoku = new DataGridViewTextBoxCell(); DataGridViewTextBoxCell laptime = new DataGridViewTextBoxCell(); jikoku.Value = String.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}", now.Hour, now.Minute, now.Second, now.Millisecond); laptime.Value = String.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}", tmp.Hours, tmp.Minutes, tmp.Seconds, tmp.Milliseconds); DataGridViewRow r = new DataGridViewRow(); r.Cells.Add(jikoku); r.Cells.Add(laptime); dataGridView1.Rows.Add(r); }