-1

現在、条件が満たされているかどうか(適切な分と秒)を確認するために100ミリ秒ごとにautoRing関数を呼び出すタイマーコールバックがあります。条件が満たされている場合は、関数btnSound_click(ベルを鳴らします)を呼び出します

問題は、ベルを 1 回だけ鳴らしたい (その後、自動的に再度鳴らす必要があるが、必要な呼び出し間隔は 30 秒以上) ことですが、問題は、autoRing が複数回呼び出され、その中でベルが複数回鳴ることです。 1 秒の時間枠。

ボタンを押すと、次のコードが実行されます。

timerSound = new Timer(new TimerCallback(autoRing), null, 0, 100);

と私の autoRing 関数:

private void autoRing(Object obj)
    {
        TimeSpan ts = timeWatch.Elapsed;

        if (ts.Minutes == bellMinutesFirst && ts.Seconds == bellSeconds || ts.Minutes == bellMinutesSecond && ts.Seconds == bellSeconds)
        {
            btnSound_Click_1(null, null);
        }

timeWatch は単なるStopwatchクラスであり、bellMinutesFirst//は単なる定数 (整数) です。bellSecondsbellMinutesSecond

timercallback を 1000ms に変更しようとしましたが、2 つの問題があります。

  1. リングは、私が望むほど正確ではありません。

  2. 一貫性がなく、2 つのリングが聞こえることもあります。

どんな助けでも大歓迎です。

4

1 に答える 1

0

コールバックでは、呼び出し音をポーリングしているかどうか、呼び出し音の後に 30 秒が経過するのを待っているかどうかを追跡できます。このようなもの:

enum AutoRingStatus { Polling, Waiting }

AutoRingStatus _autoRingStatus = AutoRingStatus.Polling;
DateTime _autoRingWaitingTill = DateTime.Now;
private void autoRing(Object obj) {
    TimeSpan ts = timeWatch.Elapsed;

    if (ts.Minutes == bellMinutesFirst && ts.Seconds == bellSeconds || ts.Minutes == bellMinutesSecond && ts.Seconds == bellSeconds) {
        if (_autoRingStatus == AutoRingStatus.Polling) {
            btnSound_Click_1(null, null);
            _autoRingStatus = AutoRingStatus.Waiting;
            _autoRingWaitingTill = DateTime.Now.AddSecond(30);
        } else {
            if (_autoRingWaitingTill <= DateTime.Now) {
                _autoRingStatus = AutoRingStatus.Polling;
            } else {
                // Waiting for the 30s to pass...
            }
        }
    }
}
于 2013-02-27T06:51:08.790 に答える