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

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

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

Re[3]: Timer_Tick内でMessageBoxを処理した場合


(過去ログ 176 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■101114 / inTopicNo.1)  Timer_Tick内でMessageBoxを処理した場合
  
□投稿者/ KT (1回)-(2023/01/07(Sat) 17:59:39)

分類:[C#] 

C#、Windowsフォーム
Timer_Tick内でMessageBoxを処理した場合の質問です。

プログラムの内容としましては、ドアが開いてるかどうかを検知して開いていればメッセージボックスに"ドアが開きました!"と表示するものです。
メッセージボックスの表示は1度のみにしたいので、表示したかどうかのフラグをつける事にしました。ソースが以下です。(改行崩れて見にくいかもしれません)

private void Timer1_Tick(object sender, EventArgs e)
{
//ドアが閉まっていれば
if (Door == false)
{
label1.Text = "ドアは閉まっています";
MessageBoxFlag = false;
}

//ドアが開いていれば
if (Door == true)
{
label1.Text = "ドアは開いています";
if (MessageBoxFlag == false)
{
MessageBoxFlag = true; //メッセージボックスを表示したというフラグ
MessageBox.Show("ドアが開きました!", "メッセージ", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}
}

このようにする事でメッセージボックスを1度のみ表示する事ができました。
ただこれを…

private void Timer1_Tick(object sender, EventArgs e)
{
//ドアが閉まっていれば
if (Door == false)
{
label1.Text = "ドアは閉まっています";
MessageBoxFlag = false;
}

//ドアが開いていれば
if (Door == true)
{
label1.Text = "ドアは開いています";
if (MessageBoxFlag == false)
{
MessageBox.Show("ドアが開きました!", "メッセージ", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
MessageBoxFlag = true; //メッセージボックスを表示したというフラグ
}
}
}

このように、MessageBoxFlag = true;をMessageBox.Showの下に書いてしまうと、メッセージボックスが何度も表示されてしまいます。これはなぜでしょうか?
メッセージボックスが表示後、フラグがtrueになるので2度目が表示されるのが何故かわからないです。
お助けいただけますでしょうか。
引用返信 編集キー/
■101115 / inTopicNo.2)  Re[1]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ KT (3回)-(2023/01/07(Sat) 18:03:58)
2023/01/07(Sat) 18:09:16 編集(投稿者)
表示崩れたので修正

        private void Timer1_Tick(object sender, EventArgs e)
        {
            //ドアが閉まっていれば
            if (Door == false)
            {
                label1.Text = "ドアは閉まっています";
                MessageBoxFlag = false;
            }

            //ドアが開いていれば
            if (Door == true)
            {
                label1.Text = "ドアは開いています";

                if (MessageBoxFlag == false)
                {
                    MessageBoxFlag = true; //この文はMessageBox.Showの上に書かないとバグる
                    MessageBox.Show("ドアが開きました!", "メッセージ", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                }

            }
        }

引用返信 編集キー/
■101116 / inTopicNo.3)  Re[1]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ KT (4回)-(2023/01/07(Sat) 18:05:19)
2023/01/07(Sat) 18:09:43 編集(投稿者)
private void Timer1_Tick(object sender, EventArgs e)
        {
            //ドアが閉まっていれば
            if (Door == false)
            {
                label1.Text = "ドアは閉まっています";
                MessageBoxFlag = false;
            }

            //ドアが開いていれば
            if (Door == true)
            {
                label1.Text = "ドアは開いています";

                if (MessageBoxFlag == false)
                {                    
                    MessageBox.Show("ドアが開きました!", "メッセージ", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    MessageBoxFlag = true; //この文はMessageBox.Showの上に書かないとバグる
                }
            }
        }

引用返信 編集キー/
■101117 / inTopicNo.4)  Re[1]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ furu (192回)-(2023/01/07(Sat) 18:18:12)
No101114 (KT さん) に返信
> このように、MessageBoxFlag = true;をMessageBox.Showの下に書いてしまうと、メッセージボックスが何度も表示されてしまいます。これはなぜでしょうか?
> メッセージボックスが表示後、フラグがtrueになるので2度目が表示されるのが何故かわからないです。
MessageBox.Show処理中に再度Timer1_Tickイベントが発生(再入)し、
trueになる前のフラグを見ているからです。
引用返信 編集キー/
■101118 / inTopicNo.5)  Re[2]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ KT (5回)-(2023/01/07(Sat) 18:28:33)
2023/01/07(Sat) 18:29:48 編集(投稿者)

No101117 (furu さん) に返信
つまりMessageBox.Showを処理している間に再度Timer1_Tickが始まってしまう事で、MessageBoxFlag = true;に到達する前に2度目の処理がされてしまうといったイメージでしょうか?
引用返信 編集キー/
■101119 / inTopicNo.6)  Re[3]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ furu (194回)-(2023/01/07(Sat) 18:37:37)
No101118 (KT さん) に返信
> つまりMessageBox.Showを処理している間に再度Timer1_Tickが始まってしまう事で、MessageBoxFlag = true;に到達する前に2度目の処理がされてしまうといったイメージでしょうか?
そうです。

メッセージボックス表示中はイベント動作します。
このおかげでメッセージボックス表示中でも
呼び出したフォームの再描画とかうまくいきます。
引用返信 編集キー/
■101120 / inTopicNo.7)  Re[4]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ KT (8回)-(2023/01/07(Sat) 18:42:39)
2023/01/07(Sat) 18:43:21 編集(投稿者)

No101119 (furu さん) に返信
ちなみにTimer_Tickのインターバルを長く取っても発生するものなのでしょうか?

インターバルがの間隔が短すぎたらメッセージボックスの処理中に2週目が始まってしまうのも納得なんですが、
インターバルを長く取れば(例えば10秒)、その間にメッセージボックスの処理も完了し、次のMessageBoxFlag = true;が実行された後に2週目が始まりそうなものなんですが…

引用返信 編集キー/
■101121 / inTopicNo.8)  Re[4]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ KT (9回)-(2023/01/07(Sat) 18:43:26)
No101119 (furu さん) に返信
ちなみにTimer_Tickのインターバルを長く取っても発生するものなのでしょうか?

インターバルがの間隔が短すぎたらメッセージボックスの処理がされる前に2週目が始まってしまうのも納得なんですが、
インターバルを長く取れば(例えば10秒)、その間にメッセージボックスの処理も完了し、次のMessageBoxFlag = true;が実行された後に2週目が始まりそうなものなんですが…

引用返信 編集キー/
■101122 / inTopicNo.9)  Re[5]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ furu (196回)-(2023/01/07(Sat) 19:00:39)
No101121 (KT さん) に返信
> ■No101119 (furu さん) に返信
> インターバルがの間隔が短すぎたらメッセージボックスの処理がされる前に2週目が始まってしまうのも納得なんですが、
> インターバルを長く取れば(例えば10秒)、その間にメッセージボックスの処理も完了し、次のMessageBoxFlag = true;が実行された後に2週目が始まりそうなものなんですが…
>
メッセージボックスが表示されてから
「OK」などのボタンをクリックされてメッセージボックスがクローズされるまでが
メッセージボックスの処理です。

10秒だと電話に出たら終わりです。
引用返信 編集キー/
■101124 / inTopicNo.10)  Re[4]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ KT (11回)-(2023/01/07(Sat) 19:12:29)
No101119 (furu さん) に返信
なるほど…
MessageBox.Showはメッセージボックスを表示した時点で処理が完了しているものだと思っていました。
閉じるまでは処理が完了していないという事なんですね。
メッセージボックスを閉じていない→処理が続いている→タイマーインターバルを満たす→Timer_Tickが再び回り出す→2度目のメッセージボックス表示
こういった流れですね。原因がわかってスッキリしました。

ちなみにですが、これを解決するには一番最初に書いたようにフラグをMessageBox.Showより上の行に立てる、以外でなにか方法はありますか?
引用返信 編集キー/
■101127 / inTopicNo.11)  Re[5]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ furu (198回)-(2023/01/07(Sat) 20:38:58)
No101124 (KT さん) に返信
> ちなみにですが、これを解決するには一番最初に書いたようにフラグをMessageBox.Showより上の行に立てる、以外でなにか方法はありますか?
MessageBox.Showの前後でタイマーを停止すればうまくいくと思います。

Timer1.Stop();
MessageBox.Show();
Timer1.Start();
引用返信 編集キー/
■101128 / inTopicNo.12)  Re[6]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ KT (13回)-(2023/01/07(Sat) 20:45:02)
No101127 (furu さん) に返信
> Timer1.Stop();
> MessageBox.Show();
> Timer1.Start();

おっしゃる通りでそのようにすればうまくいきました。
無事解決です。ありがとうございました。
引用返信 編集キー/
■101129 / inTopicNo.13)  Re[2]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ KT (14回)-(2023/01/07(Sat) 20:45:28)
解決
解決済み
引用返信 編集キー/
■101155 / inTopicNo.14)  Re[3]: Timer_Tick内でMessageBoxを処理した場合
□投稿者/ ぼーちゃん (39回)-(2023/01/13(Fri) 09:08:42)
解決済みですが・・・モーダルとモードレスの違いを
勉強するとより理解が深まるかな。

https://dobon.net/vb/dotnet/form/showform.html

https://dobon.net/vb/dotnet/form/msgbox.html
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -