0

他の誰かが私と同じような質問をしました。しかし、彼らは実際に有効な答えを得られませんでした。bool を作成し、if ステートメントに入ったら false に設定することで、これを機能させることができます。その方法を使用する前にそれを行いましたが、よりクリーンな方法があるかどうか知りたいです。

質問: シンプルな [OK] ボタンを備えたタイマーでメッセージ ボックスを使用すると、誰かが [OK] をクリックしなければならないのはなぜですか。そうしないと、毎秒同じメッセージが表示されますか? 以下のコードでは; タイマーが設定されているため(1秒刻み)、1秒ごとにポップアップしますが、以下のコードのようにタイマーが10に達したときに1回だけ表示する必要がありますが、タイマーはまだ「刻んでいる」必要がありますラベルに表示されるからです。

何らかの理由で人々がここでやりたいと思っていることに気づいたので、誰かが私を細断する前に。私のロジックでは、秒 = 10 なので、1 回表示する必要があります。秒 = 11 の場合、10 ではなく 11 であるため、追加のボックスを表示しても意味がありません。その原因も知りたいですか?

private void randomtimer_Tick(object sender, EventArgs e)
    {

        if (seconds == 10)
        {
            MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
        }
        seconds++;            
        if (seconds >= 60)
        {
            seconds = 0;
            minutes = minutes + 1;  
        }
        if (minutes >= 60)
        {
            minutes = 0;
            hours = hours + 1;
        }

        string niceTime = string.Format("{0:D2}h:{1:D2}m:{2:D2}s", hours, minutes, seconds); //format the time so it displays nicely
        label2.Text = "Session Length:\n" + niceTime;
    }
4

3 に答える 3

3

簡単な答えは、seconds後までインクリメントしていないためですMessageBox.Show()。テストの前に移動するif (seconds == 10)と、コードが機能します。

実行フローは で停止しMessageBox.Show()、別の Time イベントが発生します。タイマーに関しては、常に再入力に注意する必要があります。

于 2013-06-29T20:48:33.533 に答える
0

これをできるだけ簡単に説明しようと思います。

タイマーのハンドラーが呼び出されると、カウンターはブロックされません。指定した関数が毎秒 (タイマーの間隔) 実行されます。を表示するMessageBoxと、タイマーのハンドラのスレッドがブロックされます。したがって、秒を増やすコードは、ユーザーが [ OK ] をクリックして関数が再開されるまで実行されません。

ここで、ユーザーが [OK] を押さない場合、秒は 10 でスタックします。1 秒後、タイマーはハンドラーを再度呼び出し、if値がまだ 10 であるため実行されます。

これを防ぎたい場合は、次のようなコードを使用します。

        if (seconds == 10)
        {
            seconds++;
            MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
        }
        else
            seconds++;

もちろんもっと良い方法はありますが、これでうまくいきます。

于 2013-06-29T20:50:55.107 に答える
0

誰かがOKをクリックしなければならないこと。そうしないと、毎秒同じメッセージが表示されますか?

さて、それはあなたの問題です。コードをもう一度見てください。

if (seconds == 10)
{
    MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
}
seconds++;

Seconds は、が閉じられるまで増加しませんMessageBox.Show。これを次のように変更します。

if (seconds == 10)
{
    seconds++;
    MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
}
else seconds++;

これで問題が解決します。

于 2013-06-29T20:51:51.007 に答える