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

わんくま同盟

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

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

■92593 / 3階層)  rgbによるbackcolorの表示
□投稿者/ 魔界の仮面弁士 (2420回)-(2019/10/09(Wed) 12:04:12)
2019/10/09(Wed) 16:47:18 編集(投稿者)

No92584 (大谷刑部 さん) に返信
> 問題はおっしゃるような厳密性がこのケースで必要かどうかです。
> 質問者もタイマーイベントで解決とおっしゃっているので、

理屈までいきなり説明しても追いきれないでしょうし、初心者向けには、
『Form 上で Sleep を呼んではいけない』と伝えるようにしています。
>>> 画面上 (UI スレッド)から Thread.Sleep を呼び出してはいけません。

この原則を守ることで問題になることは無いと思いますよ。


そのための代替案としては、
案1: Thread.Sleep(t) の代わりに await Task.Delay(t) を使ってもらう
案2: ループ処理を分割して、Timer でのイベント呼び出しに置き換えてもらう
案3: Sleep 処理を BackgroundWorker 内に押し込んで、BeginInvoke で BackColor を変更させる
などが思い当たります。
No92573 の提案は案2 でしたが No92578 で案1 にも少しだけ言及しています。


=== 以下蛇足 ===

>>背景色が実際に変わるのは、
>>イベントを抜けた後(のアイドル時)になります。
> そんなことはないでしょう、refleshで見た目は変わりましたよ。

大文字小文字もスペルも間違っているようですが、それはさておき。

メッセージさえ処理されればよいので、Application.DoEvents(); や
textBox1.Update(); や textBox1.Refresh(); などを呼び出せば、
イベントを抜ける前であっても再描画処理が行われます。

それが先の回答の
>> Click イベントの最中に強制的に再描画させたいのであれば、
>> BackColor の変更後に Update メソッドを呼ぶなどの処置が必要です。
という箇所に当たります。この点については、Sleep を呼んでいるかどうかは影響しません。


一方、元質問者である C#初心者 さんのコードでは、Refresh や Update 等の
呼び出しが行われていたわけではありませんので、
>> イベントを抜けた後(のアイドル時)になります。
という説明にさせていただきました。


実際に、先の実験コードを使って確認してもいますが、
イベント脱出後でないと WndProc が処理されないことを確認しています。
ループ中で Update や Refresh した場合は、即時処理されるのですけれどね。

Refresh は Invalidate + Update を呼び出したのと同義となりますが、
今回のケースでは、BackColor の変更が発生しているわけなので、
Update だけでも事足りると思います。

とはいえ、Update や Refresh によって処理されるメッセージは描画関係に限定されます。

Label ならまだしも、今回の対象は TextBox ですから、
その他の処理(ユーザー入力等)も阻害されてしまうのはまずいので、
どちらにせよ Sleep の出番は無さそうです。


> 人の感覚次第かもしれませんが、質問者さんは色の移り変わりを見たいのでしょ?
> であれば25秒はさほど長いとは思いません。
> 仮に、お客さんに納品するPGとしても、そうそう、数秒でイラつくお客さんばっかりじゃないでしょう。

何か長い処理をしている間、次の処理が行えないとか、
砂時計カーソルになるとか、キャンセルできないといった話をしているなら、
それは別に構わないと思います。(それは単にアプリの仕様というだけの話)

背景色が変化していくアニメーション効果として、
25 秒間かけて変化させることもまったく問題ありません。問題なのは
25 秒間応答不能になってしまう点のみであり、「長い処理の間」も
メッセージループを回すような仕組みにさえなっていれば OK です。

(たとえば HWND_BROADCAST 向けのメッセージを止めてしまうと、
 自アプリは良くても、他アプリに迷惑がかかります)
解決済み
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[2]: 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
││└ Re[3]: rgbによるbackcolorの表示 / 魔界の仮面弁士 (19/10/08(Tue) 17:45) #92578
││  └ 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 解決済み
    └ rgbによるbackcolorの表示 / 魔界の仮面弁士 (19/10/09(Wed) 12:04) #92593 解決済み ←Now

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