private void updateDisplay(Object displayBlock)
{
TimeSpan ts = timeWatch.Elapsed;
if (stopRing == true)
{
stopRing = true;
Thread.Sleep(1000);
stopRing = false;
}
if (ts.Minutes == 0 && ts.Seconds == 10 && ts.Milliseconds <= 100 && stopRing == false)
{
stopRing = true;
btnSound_Click_1(null, null);
}
TextBlock db = (TextBlock)displayBlock;
db.Dispatcher.BeginInvoke(delegate() { db.Text = String.Format("{0:00}:{1:00}", ts.Minutes, ts.Seconds); });
}
編集:if(stopRing == true)の理由は、将来、以下の関数に条件を追加して、一定期間後に再び鳴るようにするためです。たとえば、次のようになります。
if (ts.Minutes == 0 && ts.Seconds == 10 && ts.Milliseconds <= 100 && stopRing == false || ts.Minutes == 0 && ts.Seconds == 20 && ts.Milliseconds <= 100 && stopRing == false)
ただし、デバッグ中の作業を簡単にするために、ts.Seconds = 10のときに1回だけ鳴るようにif条件を作成しました。リセットボタンを押すと、ts.Secondsが0から10に戻ると、1回だけ鳴るはずです。 、しかし現時点では、予期せずに複数回鳴ります。
効果音の私のコードは次のとおりです。
private void btnSound_Click_1(object sender, RoutedEventArgs e)
{
Stream stream = TitleContainer.OpenStream("sounds/Ding.wav");
SoundEffect effect = SoundEffect.FromStream(stream);
FrameworkDispatcher.Update();
effect.Play();
}
更新表示関数は次のように呼び出されます。
timer = new Timer(new TimerCallback(updateDisplay), textblockTimer, 0, 100);
何が起こるかというと、TimerCallBack期間を低い値(ここに表示されている100など)に切り替えると、SoundEffectが複数回非常に高速に再生されます。TimerCallBackを500などのより高い値に増やすと、SoundEffectは2〜3回再生され、場合によってはすぐに再生され、その間に約200ミリ秒の遅延が発生します。
ここでアイデアが不足しています...ブール値をtrueに指定して、実行をブロックすると、サウンドをどのように再生できるかわかりません。どんな助けでも大歓迎です。
(stopRingはコードの上に定義されています)
編集:追加するものがいくつかあります:最初のラウンドでは、SoundEffectは通常うまく再生されます(1回のみ)。しかし、リセットボタンを押して再試行すると、ほとんどの場合、SoundEffectが複数回再生されますが、問題がない場合もあります。
リセットボタンのコードは次のとおりです。
private void btnReset_Click(object sender, RoutedEventArgs e)
{
timeWatch.Stop();
timeWatch.Reset();
paused = true;
btnStartStop.Content = "Start";
textblockTimer.Text = "00:00";
}
と私の開始/停止ボタン:
private void btnStartStop_Click(object sender, RoutedEventArgs e)
{
if (paused == true)
{
timeWatch.Start();
timer = new Timer(new TimerCallback(updateDisplay), textblockTimer, 0, 100);
paused = false;
btnStartStop.Content = "Pause";
}
else
{
timeWatch.Stop();
paused = true;
btnStartStop.Content = "Start";
}
}