C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: C# Timerクラスの使い方


(過去ログ 133 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■78552 / inTopicNo.1)  C# Timerクラスの使い方
  
□投稿者/ 時のサラリーマン (1回)-(2016/01/25(Mon) 12:51:11)

分類:[C#] 

C# で 55ms以下の精度でタイマーを使いたく。 Timerクラスたるものを導入したいと考えています。

ボタンを押したらタイマーがスタートして、countという変数を1ずつ加算させたい場合、

タイマースタートしたときの動きをプログラムのどこに記載して、

別クラスからどうやって呼び出せばいいのかどなたか教えて頂けませんでしょうか?



using System.Timers;
class Timer
{
static void Main(string[] args)
{
// タイマーの生成
var timer = new Timer();
timer.Elapsed += new ElapsedEventHandler(OnElapsed_TimersTimer);
timer.Interval = 1000;

// タイマーを開始
timer.Start();

// タイマーを停止
timer.Stop();
}

static void OnElapsed_TimersTimer(object sender, ElapsedEventArgs e)
{
    count += 1; // こんな感じでしょうか?
}
}




別クラスで、、、

private void button1_Click(object sender, EventArgs e)
{
timer1.Start(); //タイマー呼び出しはこんな感じでしょうか?

}
引用返信 編集キー/
■78555 / inTopicNo.2)  Re[1]: C# Timerクラスの使い方
□投稿者/ 魔界の仮面弁士 (633回)-(2016/01/25(Mon) 13:59:14)
No78552 (時のサラリーマン さん) に返信
> C# で 55ms以下の精度でタイマーを使いたく。

タイマーと一口に言っても
 System.Windows.Forms.Timer
 System.Threading.Timer
 System.Timers.Timer
 System.Windows.Threading.DispatcherTimer
のように、幾つかの異なる Timer があるわけですが、
今回は System.Timers.Timer に対する質問なのですね。


> countという変数を1ずつ加算させたい場合、
その count 変数は、何のために使うのでしょうか?


>     count += 1; // こんな感じでしょうか?
ローカル変数ならそれでも良いですが、フィールド変数なら
 Interlocked.Increment(ref count);
の方が良いかも。


> タイマースタートしたときの動きをプログラムのどこに記載して、
> 別クラスからどうやって呼び出せばいいのかどなたか教えて頂けませんでしょうか?

タイマー側のスレッドが処理を行っている間、
メインスレッドが終了しないようにします。

たとえばシステムに常駐監視させたいような用途なら、
アプリケーションを「Windows サービス」として作成し、
OnStart メソッドでタイマーを開始すれば良いでしょう。


「コンソール アプリケーション」の場合は、
下記を参照してみてください。
http://codezine.jp/article/detail/135
引用返信 編集キー/
■78570 / inTopicNo.3)  Re[2]: C# Timerクラスの使い方
□投稿者/ 774RR (371回)-(2016/01/26(Tue) 10:32:50)
元ネタはこの辺だろうか。
http://garafu.blogspot.jp/2015/01/c-timer.html

ここの例は「使い方」の解説に留まっている(解説のための解説として極めて適切)
実用に供するには違う書き方が必要だ。

> タイマースタートしたときの動きをプログラムのどこに記載して、
> 別クラスからどうやって呼び出せばいいのかどなたか教えて頂けませんでしょうか?
こういう質問が出るということはオブジェクト指向的考えが身についていないということだ。

・そのタイマーという部品は、別の何かの所有物であるはずだ
・「別の何か」というのは状況によって異なる。
 フォームアプリケーションなら Form1 に持たせると良いだろう。

そうすると「別のクラスからどうやって」という質問はそもそも出ないんだ。

System.Timers.Timer はスレッドプールで動作するので、
タイマーハンドラ内部で UI 部品にアクセスする際には MSDN に書いてあるとおり
SynchronizingObject を指定しないといけない。
(が、指定すると System.Windows.Forms.Timer と同じ動作になるので意味無いかも?)

だけどそもそもの話として、そんなに高速・高精度な「タイマー」が必要なの?
経過時間の計測がしたいのならタイマーによらずに可能だよ。
System.Environment.TickCount とか
System.Diagnostics.StopWatch とか
System.DateTime.Now.Ticks とか
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -