画像ファイル
画像ファイル マルチスレッドのストップウオッチ C#
画像ファイル
C#のコード
C#のコード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace BackGrowndWorkerC3
{
public partial class FomStopwatch : Form
{
//状態を表す定数
const int STOP = 0;
const int START = 1;
const int LAP = 2;

//上の3つ状態を保持します
int States = 0 ;

//秒を保持します
int Second = 0;

//スレッドの宣言
System.Threading.Thread timerThread;

//現在の時刻の表示と、タイマーの表示に使用されるデリゲート
delegate void dlgSetString(object lbl,string text);

//ラップ時のドットの表示非表示に使用されます
delegate void dlgGene();

//ストップウオッチクラス
System.Diagnostics.Stopwatch MyStopWatch = new System.Diagnostics.Stopwatch();

//コンストラクタ
public FomStopwatch()
{
InitializeComponent();

//スレッドのインスタンスの作成とスタート
timerThread = new System.Threading.Thread(DoWork);
timerThread.Start();
}

//スタートボタン押下
private void butStart_Click(object sender, EventArgs e)
{
//Stopから押されてか又はLapから押されたかによって処理を変える
switch (States)
{
case STOP:       //Stopから押された
MyStopWatch.Reset();  //ストップウオッチを初期化
MyStopWatch.Start(); //ストップウオッチのスタート
States = START; //ステートを変える
butStart.Enabled = false; //ボタンのEnableを変える
butStop.Enabled = true;
butLap.Enabled = true;
break;
case LAP:  //Lapから押された
MyStopWatch.Start();
States = START;
butStart.Enabled = false;
butStop.Enabled = true;
butLap.Enabled = true;
break;
}
picDot.Visible = false; //Lap時のドットの表示を非表示に
}

//Lapボタンが押された
private void butLap_Click(object sender, EventArgs e)
{
States = LAP;
butStart.Enabled = true ;
butStop.Enabled = true;
butLap.Enabled = false;
}

//ストップボタンが押された
private void butStop_Click(object sender, EventArgs e)
{
MyStopWatch.Stop(); //ストップウオッチの停止

//Lapから停止時には最後の時間を書き込む
if(States==LAP)
{
lblTimer.Text = string.Format("{00:00:00:00:000}", MyStopWatch.ElapsedMilliseconds);
}
butStart.Enabled = true;
butStop.Enabled = false;
butLap.Enabled = false ;
States = STOP;
//ドット表示を非表示に
picDot.Visible = false;
}

//デリゲートで別スレッドから呼ばれてラベルに現在の時間又は
//ストップウオッチの時間を表示する
private void ShowTime(object sender,string strTime)
{
Label lbl = (Label)sender; //objectをLabelにキャストする
lbl.Text = strTime;
}

//Lapの場合一秒ごとに別スレッドからデリゲートに呼ばれ
//ドットの表示非表示を行なう
private void ChangePicColor()
{
picDot.Visible = !picDot.Visible;
}

//別スレッド上で行なわれる処理
private void DoWork()
{
//スレッドが停止状態でなければ
while (true)
{
//1msecのウエイト、CPUの使用率を下げる
System.Threading.Thread.Sleep(1);

try
{
//秒が変更されたら
if (Second != DateTime.Now.Second)
{
//時間を文字列に直す
string strTime = string.Format("{0:00}", DateTime.Now.Hour)
+ ":" + string.Format("{0:00}", DateTime.Now.Minute)
+ ":" + string.Format("{0:00}", DateTime.Now.Second) + ":"
+ string.Format("{0:000}", DateTime.Now.Millisecond);
//匿名デリゲートで現在の時間をラベルに表示する
this.Invoke(new dlgSetString(ShowTime), new object[] { lblTime, strTime });
if (States == LAP)
{
//匿名デリゲートでドットの表示非表示情報を渡す
this.Invoke(new dlgGene(ChangePicColor), new object[] { });
}
//秒の保持
Second = DateTime.Now.Second;
}

//ストップウオッチが動作していたら時間を表示する
if (States == START)
{
//ストッップウオッチの時間を文字に直す
string eTime = string.Format("{00:00:00:00:000}", MyStopWatch.ElapsedMilliseconds);
//匿名デリゲートで時間を渡す
this.Invoke(new dlgSetString(ShowTime),new object[] { lblTimer, eTime });
//dlgSetString SetString = new dlgSetString(ShowTime);
//this.Invoke(SetString,lblTimer, eTime);
}
}
catch
{
//このエラーはフォームを閉じたときに発生します
}
}
}

//フォームが閉じられるとき発生します
private void FomStopwatch_FormClosing(object sender, FormClosingEventArgs e)
{
//キャンセルを有効にする
timerThread.Abort();

}
}
}
画像 サンプルコードのダウンロード
画像ファイル    ← VB2005 BackgroundWorkerの魅力(1)