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

わんくま同盟

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

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


(過去ログ 18 を表示中)
■6846 / )  Re[1]: Control.Invokeが使えない件。
□投稿者/ NyaRuRu (11回)-(2007/08/24(Fri) 23:10:15)
2007/08/24(Fri) 23:14:17 編集(投稿者)
No6843 (れい さん) に返信
> Control.InvokeやEndInvokeを何も考えずに使うと、
> Controlを廃棄した際にデッドロックします。
> Invokeがウィンドウメッセージを送り、返事を待ってる間に
> Controlが廃棄された場合、いつまで待っても返事が返ってこないからです。

ほんとかなと思って試してみましたが,
以下のケースでは閉じたフォームに対する Invoke で InvalidOperationException 例外が発生しました.
以下 C# ですが,Form を作って Load イベントを次のように設定してください.

private void Form1_Load(object sender, EventArgs e)
{
    Button button = new Button();
    button.Click +=
        delegate(object _sender, EventArgs _e)
        {
            Form frm = new Form();
            frm.Show();
            Thread thread = new Thread(delegate()
            {
               try
               {
                   while (true)
                   {
                       frm.Invoke(
                           (MethodInvoker)
                           delegate { frm.Text = DateTime.Now.ToString(); });
                       Thread.Sleep(1000);
                   }
               }
               catch (Exception exp)
               {
                   MessageBox.Show(exp.Message);
               }
            });
            thread.Start();
        };
    this.Controls.Add(button);
}
ボタンを押すとスレッドが起動され,
表示用フォームのタイトルを現在時刻で更新していきます.

Windows のメッセージキューはスレッドごとに独立しており,
ひとつのメッセージキューに複数のウィンドウが所属します.
これを称して,「ウィンドウ1はスレッドXに所有される」みたいな感じになると.
・スレッドX
    メッセージポンプ
      ウィンドウ1
      ウィンドウ2
      ウィンドウ3
が,http://bbs.wankuma.com/index.cgi?mode=al2&namber=6760 では
別スレッドでウィンドウを開いていますよね? あれって
・スレッドX
    メッセージポンプ
      ウィンドウ1
・スレッドY
    メッセージポンプ
      ウィンドウ2
みたいなことをしたいということなのでしょうか?
(と,れいさんに聞いても仕方がないと思いますが)

返信 編集キー/


管理者用

- Child Tree -