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

わんくま同盟

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

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

■92578 / 3階層)  rgbによるbackcolorの表示
□投稿者/ 魔界の仮面弁士 (2417回)-(2019/10/08(Tue) 17:45:17)
2019/10/08(Tue) 19:43:03 編集(投稿者)

No92577 (大谷刑部 さん) に返信
> なので、sleepとプロパティーの設定だけだと肉眼で確認する前に次の色に変わっているという現象になっていると想像されます。

いいえ。イベント処理中は、そもそもメッセージループが処理されないので、
肉眼でも心眼でも変化しません。背景色が実際に変わるのは、
イベントを抜けた後(のアイドル時)になります。

Click イベントの最中に強制的に再描画させたいのであれば、
BackColor の変更後に Update メソッドを呼ぶなどの処置が必要です。


// ListBox と Button を貼り、
// Button の Click イベントを割り当てておきます
public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
    Controls.Add(editBox1 = new EditBox(listBox1) { Name = "editBox1" });
  }

  private void button1_Click(object sender, EventArgs e)
  {
    listBox1.Items.Insert(0, "==> button1_Click");
    for (int i = 0; i <= 255; i++)
    {
      editBox1.BackColor = Color.FromArgb(i, i, i);
      // editBox1.Update();
    }
    listBox1.Items.Insert(0, "<== button1_Click");
  }

  // TextBox に届く Windows Message を捉えて表示する実験
  private EditBox editBox1;
  private class EditBox : TextBox
  {
    private ListBox listBox1;
    public EditBox(ListBox listBox1) { this.listBox1 = listBox1; }

    private int Count = 0;
    protected override void WndProc(ref Message m)
    {
      // 受信したメッセージを、親フォームの ListBox に表示
      listBox1.Items.Insert(0, ++Count + "\t" + m.ToString());
      base.WndProc(ref m);
    }
  }
}



> ただまあ、この程度の処理(白⇔黒)であれば、メモリ負荷とかに
> それほどクリティカルな影響はないのforループでもいいんじゃないでしょうか?

『await Task.Delay(100);』とかであればいざ知らず、元の処理は
『Thread.Sleep(100);』を使っている点が問題になるかと思います。

OS にとってのメモリ負荷や CPU 負荷が軽微であったとしても、
元のコードだと 256 × 100msec なのですから、Click するだけで
25 秒以上も自アプリが待機状態(フリーズ状態)になりますよね…?

そもそも Sleep を実施している間、画面の再描画も行われないため、
このような待ち合わせ方法には、あまり意味が無いでしょう。

Sleep はスレッドの動作を一時的に止めてしまうため、
先のループ処理の間、キーボード入力やフォームの移動はおろか、
OS の再起動要求も受けられないことになるわけで、
Windows App の実装方法としては、かなり問題があるかと思います。



Sleep メソッドのリファレンスより引用:
> このメソッドは、標準 COM/SendMessage ポンピングを実行しません。

Sleep API のリファレンスより引用:
> Sleep 関数と、ウィンドウを直接的または間接的に作成するコードを組み合わせて
> 使う場合は、注意が必要です。1 つのスレッドがウィンドウを作成した場合、
> そのスレッドはそのウィンドウに関係するメッセージを処理しなければなりません。
> また、メッセージのブロードキャスト(同報送信)が発生した場合、
> システム内のすべてのウィンドウへそのメッセージが送信されます。


ウィンドウメッセージを受け取らないスレッド
(コンソールアプリやワーカースレッド等)であれば、
Sleep メソッドで待機しても問題ありません。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[2]: rgbによるbackcolorの表示 /大谷刑部 →Re[4]: rgbによるbackcolorの表示 /大谷刑部
 
上記関連ツリー

rgbによるbackcolorの表示 / C#初心者 (19/10/08(Tue) 15:04) #92572
Re[1]: rgbによるbackcolorの表示 / 魔界の仮面弁士 (19/10/08(Tue) 15:40) #92573
│├ Re[2]: rgbによるbackcolorの表示 / 大谷刑部 (19/10/08(Tue) 16:35) #92577
││└ rgbによるbackcolorの表示 / 魔界の仮面弁士 (19/10/08(Tue) 17:45) #92578 ←Now
││  └ Re[4]: rgbによるbackcolorの表示 / 大谷刑部 (19/10/09(Wed) 09:35) #92584
│└ Re[2]: rgbによるbackcolorの表示 / C#初心者 (19/10/08(Tue) 16:24) #92575
Re[1]: rgbによるbackcolorの表示 / 大谷刑部 (19/10/08(Tue) 16:04) #92574
  ├ Re[2]: rgbによるbackcolorの表示 / C#初心者 (19/10/08(Tue) 16:25) #92576
  └ Re[2]: rgbによるbackcolorの表示 / まりもん (19/10/09(Wed) 10:00) #92586
    ├ Re[3]: rgbによるbackcolorの表示 / C#初心者 (19/10/09(Wed) 10:46) #92588 解決済み
    └ Re[3]: rgbによるbackcolorの表示 / 魔界の仮面弁士 (19/10/09(Wed) 12:04) #92593 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信