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

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

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

C# 条件待機プログラム

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

■93920 / inTopicNo.1)  C# 条件待機プログラム
  
□投稿者/ RNER (1回)-(2020/02/19(Wed) 20:52:20)

分類:[C#] 

Visual C# プログラムの質問です。

button1押して変数int Countの数値を一定時間監視させて、Countが1になったらメッセージが出るようにしたいです。


        private void button1_Click(object sender, EventArgs e)
        {

            //100秒待機
            for (int i = 1; i <= 100; i++)
            {
                System.Threading.Thread.Sleep(1000);
                
        if(Count == 1)
                {
                     break;
                }
                else
                {
                }
            }

            MessageBox.Show("- 終了しました", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }


        private void button2_Click(object sender, EventArgs e)
        {
            Count = 1;
            Refresh();
        }

button2を押すと強制的にCountを1にしてbutton1のイベントであるMessageBoxが出る動作に進ませたいのですが
どうしたら良いでしょう? System.Threading.Thread.Sleepを使うとbutton2が押せなくなってしまいます。

MessageBoxを出すタイミングを他の動作が終了してからにしたい、という意図です。

引用返信 編集キー/
■93921 / inTopicNo.2)  Re[1]: C# 条件待機プログラム
□投稿者/ Azulean (1133回)-(2020/02/19(Wed) 21:48:34)
No93920 (RNER さん) に返信
> button2を押すと強制的にCountを1にしてbutton1のイベントであるMessageBoxが出る動作に進ませたいのですが
> どうしたら良いでしょう? System.Threading.Thread.Sleepを使うとbutton2が押せなくなってしまいます。

Windows アプリケーションでは画面の何らかの操作をしたときに発生するイベント、たとえば Click イベントから抜けないと次の操作ができないようになっています。
ユーザーに操作を認めたいなら、Click イベントから抜けて、処理を別スレッドで実行する必要があります。

お使いの .NET Framework のバージョンによりますが、Task や async/await で簡潔に書けます。
ただ、async/await を使ったとしても、実際にはスレッドを分けることになります。

private async void button1_Click(object sender, EventArgs e)
{
    await Task.Run(() => {

    //100秒待機
    for (int i = 1; i <= 100; i++)
    {
        System.Threading.Thread.Sleep(1000);
        
    if(Count == 1)
        {
             break;
        }
        else
        {
        }
    }

    });
    MessageBox.Show("- 終了しました", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}

なお、これは Task によってスレッドを分けているため、処理中も button1 や button2 をクリックできるようになります。
同じ button1 を何度も実行されてしまう可能性があるので、button1.Enabled = false; などで押せないようにする必要があるかもしれません。

async/await が使えないバージョンであれば Thread や BackgroundWorker などを使って別スレッドで処理することになります。

引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ