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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.92578 の関連記事表示

<< 0 >>
■92578  Re[3]: rgbによるbackcolorの表示
□投稿者/ 魔界の仮面弁士 -(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 メソッドで待機しても問題ありません。
記事No.92572 のレス /過去ログ160より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -