サーチ…
構文
-
myTimer.Interval
- 「Tick」イベントが呼び出される頻度をミリ秒単位で設定します。 -
myTimer.Enabled
- タイマを有効/無効にするブール値 -
myTimer.Start()
- タイマーを開始します。 -
myTimer.Stop()
- タイマーを停止します。
備考
Visual Studioを使用している場合は、ツールボックスからフォームに直接タイマーをコントロールとして追加できます。
マルチスレッドタイマ
System.Threading.Timer
- 最も単純なマルチスレッドタイマー。 2つのメソッドと1つのコンストラクタが含まれます。
例:タイマーはDataWriteメソッドを呼び出します。このメソッドは、5秒後に「マルチスレッドが実行されました...」と書き込まれ、その後、ユーザーがEnterキーを押すまで1秒ごとに1秒ごとに書き込みます。
using System;
using System.Threading;
class Program
{
static void Main()
{
// First interval = 5000ms; subsequent intervals = 1000ms
Timer timer = new Timer (DataWrite, "multithread executed...", 5000, 1000);
Console.ReadLine();
timer.Dispose(); // This both stops the timer and cleans up.
}
static void DataWrite (object data)
{
// This runs on a pooled thread
Console.WriteLine (data); // Writes "multithread executed..."
}
}
注:マルチスレッドタイマーを廃棄するための別のセクションを投稿します。
Change
- このメソッドは、タイマーの間隔を変更するときに呼び出すことができます。
Timeout.Infinite
- 1回だけ発射したい場合。これをコンストラクタの最後の引数で指定します。
System.Timers
- .NET Frameworkによって提供される別のタイマークラス。これは、 System.Threading.Timer
ラップしSystem.Threading.Timer
。
特徴:
-
IComponent
- Visual Studioのデザイナーのコンポーネントトレイに配置できるようにする -
Change
メソッドではなくInterval
プロパティ - コールバック
delegate
代わりにElapsed
event
- タイマーを開始および停止する
Enabled
プロパティー(default value = false
) -
Enabled
プロパティ(上記のポイント)で混乱した場合に備えて、Start
&Stop
メソッド -
AutoReset
- 定期的なイベントを示すため(default value = true
) - WPF要素とWindowsフォームコントロール上のメソッドを安全に呼び出すための
Invoke
メソッドとBeginInvoke
メソッドとのSynchronizingObject
プロパティ
上記のすべての機能を表す例:
using System;
using System.Timers; // Timers namespace rather than Threading
class SystemTimer
{
static void Main()
{
Timer timer = new Timer(); // Doesn't require any args
timer.Interval = 500;
timer.Elapsed += timer_Elapsed; // Uses an event instead of a delegate
timer.Start(); // Start the timer
Console.ReadLine();
timer.Stop(); // Stop the timer
Console.ReadLine();
timer.Start(); // Restart the timer
Console.ReadLine();
timer.Dispose(); // Permanently stop the timer
}
static void timer_Elapsed(object sender, EventArgs e)
{
Console.WriteLine ("Tick");
}
}
Multithreaded timers
- スレッドプールを使用して、いくつかのスレッドが多数のタイマーを処理できるようにします。コールバックメソッドまたはElapsed
イベントは、呼び出されるたびに別のスレッドでトリガされる可能性があります。
Elapsed
- このイベントは、以前のElapsed
イベントが実行を終了したかどうかにかかわらず、時間のElapsed
とともに常に発生します。このため、コールバックまたはイベントハンドラはスレッドセーフでなければなりません。マルチスレッドタイマーの精度は、OSによって異なりますが、通常は10〜20 msです。
interop
- より正確な精度が必要な場合は、これを使用してWindowsマルチメディアタイマーを呼び出します。これは1msまでの精度を持ち、 winmm.dll
で定義されていwinmm.dll
。
timeBeginPeriod
- これを最初に呼び出し、高いタイミング精度が必要であることをOSに通知する
timeSetEvent
-後にこれを呼び出すtimeBeginPeriod
マルチメディアタイマーを開始します。
timeKillEvent
- timeKillEvent
したらこれを呼び出すと、タイマーが停止します
timeEndPeriod
- これを呼び出すと、高いタイミング精度が不要になったことをOSに通知します。
dllimport
winmm.dll
timesetevent
というキーワードを検索することで、マルチメディアタイマーを使用する完全な例をインターネット上で見つけることができます。
タイマーのインスタンスの作成
タイマーは、特定の時間間隔でタスクを実行するために使用されます(Y秒ごとにDo X)。以下は、タイマーの新しいインスタンスを作成する例です。
注 :これは、WinFormsを使用するタイマーに適用されます。 WPFを使用している場合は、 DispatcherTimer
using System.Windows.Forms; //Timers use the Windows.Forms namespace
public partial class Form1 : Form
{
Timer myTimer = new Timer(); //create an instance of Timer named myTimer
public Form1()
{
InitializeComponent();
}
}
Timerに "Tick"イベントハンドラを割り当てる
タイマーで実行されるすべてのアクションは、「Tick」イベントで処理されます。
public partial class Form1 : Form
{
Timer myTimer = new Timer();
public Form1()
{
InitializeComponent();
myTimer.Tick += myTimer_Tick; //assign the event handler named "myTimer_Tick"
}
private void myTimer_Tick(object sender, EventArgs e)
{
// Perform your actions here.
}
}
例:タイマーを使用して単純なカウントダウンを実行する。
public partial class Form1 : Form
{
Timer myTimer = new Timer();
int timeLeft = 10;
public Form1()
{
InitializeComponent();
//set properties for the Timer
myTimer.Interval = 1000;
myTimer.Enabled = true;
//Set the event handler for the timer, named "myTimer_Tick"
myTimer.Tick += myTimer_Tick;
//Start the timer as soon as the form is loaded
myTimer.Start();
//Show the time set in the "timeLeft" variable
lblCountDown.Text = timeLeft.ToString();
}
private void myTimer_Tick(object sender, EventArgs e)
{
//perform these actions at the interval set in the properties.
lblCountDown.Text = timeLeft.ToString();
timeLeft -= 1;
if (timeLeft < 0)
{
myTimer.Stop();
}
}
}
結果は...
等々...