0
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";
        }
    }
4

2 に答える 2

0

コード内の「論理エラー」を叫ぶものがいくつかあります。

  • 2番目ifのinupdateDisplayは、の値をチェックしますがstopRingstopRingその時点では常にfalseになります(メソッドが呼び出されたときにtrueだった場合、前のコードブロックでfalseに設定されます)
  • updateDisplay100msごとに呼び出されるように関数を設定しましたがThread.Sleep、1000msが含まれています。

この時点では、何があなたの見ている振る舞いを正確に引き起こしているのかわかりませんが、これはあなたに調査するためのいくつかの道を与えるはずです。

于 2013-02-21T17:50:56.033 に答える
0

問題が見つかりました。リセットボタンを押してタイマーを再調整するときに timer.Dispose() メソッドを呼び出して、タイマーの前のインスタンスが新しいインスタンスに干渉しないようにする必要があります。

解決しました!

では、これはどういう意味ですか?これは、stopRing ブール値を使用する必要がなくなったことを意味し (それが役立つわけではありません)、コードがよりクリーンになります。

助けてくれてありがとう!

于 2013-02-22T02:53:42.243 に答える