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

わんくま同盟

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

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


(過去ログ 78 を表示中)
■45882 / )  timerについて
□投稿者/ イチ (6回)-(2010/01/21(Thu) 15:11:03)

分類:[.NET 全般] 

すみません。また質問させて頂きます。私はC#で簡単なメトロノームを作ろうとしているのですが、どうしてもテンポがずれてしまいます。
timerを使って時間を計算しているのですが、timerでは若干ズレが生じるのでしょうか?


プログラムの内容はこんな感じです。
テンポを120として実装すると、ans=5となり、0.1秒毎に実装されるtimer2_Tickにてansの値を1ずつ引いています。
ans=1となった時、音を鳴らして、カウントを1つ増やします。

timer2_Tickの呼び出し
1回目:ans=5-1=4
2回目:ans=4-1=3
3回目:ans=3-1=2
4回目:ans=2-1=1
5回目:ans==1なので音を鳴らして、カウントを増やす。

以上により、音をならすのには0.5秒かかります。120のテンポを考えると、0.5秒に1回音が鳴れば正しいので、この考えでいいのではないかと思うのですが、60秒間実装すると、カウント数は110になってしまい、少し遅いです。
これはアルゴリズムに問題があるのでしょうか?それともtimerにはズレが生じてしまうのでしょうか?
よろしくお願いします。

private void bstart_Click(object sender, EventArgs e)
{
secTime = 0;
count = 0;

x = (int)TENPO.Value; // テンポを取得
ans =(double) 60 / x ; //ディレイタイムの計算(sec)
ans = System.Math.Round(ans, 2); //ansを少数第2位までにする

ANS.Text = ans.ToString();

timer1.Start();
timer2.Start();

bstart.Enabled = false; //ボタンの2度押しを防ぐ

ans = ans*1000; //単位をmsecに直す


ans = (double)ans / 100;

}
  //0.1秒毎に呼び出されるイベント
private void timer2_Tick(object sender, EventArgs e)
{
txt2 = (double)ans / 10; //値を少数になおす ex.500→0.5
txt2 = System.Math.Round(txt2, 2);
nokori.Text = txt2.ToString();//msecをsecにして表示
CO.Text = count.ToString();



if (ans == 1)
{
count = count + 1;
CO.Text = count.ToString();
PlaySound("se_saa01.wav");
//ansの初期化
ans = (double)60 / x; //ディレイタイムの計算(sec)
ans = System.Math.Round(ans, 2); //ansを少数第2位までにする
ans = ans * 1000; //単位をmsecに直す
ans = (double)ans / 100;


}
else
{
ans = ans - 1;
label6.Text = ans.ToString();
}
}


返信 編集キー/


管理者用

- Child Tree -