- - PR -
Windowsフォームのスレッドセーフな呼び出しはどうやって実現する?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-07-07 15:16
VS2003に作ったプログラムをVS2005に移動するとき、デッバグで実行するとき、InvalidOperationExceptionが発生されました。スレッドセーフな呼び出し方法を教えてください。
背景: Form1はForm2のownerです。マルチスレッドにForm2のオブジェクトを初期化する、Form2.ShowDialog(this)メッソドをコールする場合、InvalidOperationExceptionが発生した。 | ||||
|
投稿日時: 2006-07-07 15:23
参考になると思います。
http://msdn2.microsoft.com/ja-JP/library/ms171728.aspx _________________ 囚人のジレンマな日々 | ||||
|
投稿日時: 2006-07-07 15:56
MSDNで言った方法をやってみましたが、解決できない状態でした。
| ||||
|
投稿日時: 2006-07-07 16:16
どう解決しなかったのか、知っているのは君だけだぞ。 それを言ってくれなきゃ前進しないことはわかるだろ。な! | ||||
|
投稿日時: 2006-07-10 10:45
ソースは以下のとおりです。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace ThreadSafe { public partial class Form1 : Form { public Form1() { InitializeComponent(); // Control.CheckForIllegalCrossThreadCalls = false; } private Thread m_Thread; private void buttonShow_Click(object sender, EventArgs e) { if (m_Thread != null && m_Thread.IsAlive) { m_Thread.Abort(); m_Thread.Join(); } ThreadStart start = new ThreadStart(ShowForm2); m_Thread = new Thread(start); m_Thread.Start(); } private void ShowForm2() { this.SetTextBox("Hello");//スレッドセーフ // this.textBox1.Text = "スレッドセーフではない";//スレッドセーフではない方法 // Form2 form = new Form2(); // form.ShowDialog(this); //スレッドセーフではない。 Form2 form = new Form2(); form.ShowDialog(ShowForm());//スレッドセーフと思っている、スレッドセーフではないになった。 } private delegate Form1 ShowForm2Delegate(); private Form1 ShowForm() { if (this.InvokeRequired) { ShowForm2Delegate showDele = new ShowForm2Delegate(ShowForm); return (Form1)this.Invoke(showDele); } else { return this; } } private delegate void SetTextBoxDelegate(string text); private void SetTextBox(string text) { if (this.InvokeRequired) { SetTextBoxDelegate setTextDele = new SetTextBoxDelegate(SetTextBox); this.textBox1.Invoke(setTextDele,text); } else { this.textBox1.Text = text; } } } } Form2 form = new Form2(); form.ShowDialog(ShowForm());で「有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'Form1' がアクセスされました。」異常が発生されました。 どうやったスレッドセーフな呼び出しを書きますか? |
1