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
みたいなことをしたいということなのでしょうか?
(と,れいさんに聞いても仕方がないと思いますが)