- PR -

Windowsフォームのスレッドセーフな呼び出しはどうやって実現する?

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/07/07
投稿数: 3
投稿日時: 2006-07-07 15:16
VS2003に作ったプログラムをVS2005に移動するとき、デッバグで実行するとき、InvalidOperationExceptionが発生されました。スレッドセーフな呼び出し方法を教えてください。

背景:
   Form1はForm2のownerです。マルチスレッドにForm2のオブジェクトを初期化する、Form2.ShowDialog(this)メッソドをコールする場合、InvalidOperationExceptionが発生した。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-07-07 15:23
参考になると思います。
http://msdn2.microsoft.com/ja-JP/library/ms171728.aspx
_________________
囚人のジレンマな日々
未記入
会議室デビュー日: 2006/07/07
投稿数: 3
投稿日時: 2006-07-07 15:56
MSDNで言った方法をやってみましたが、解決できない状態でした。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-07-07 16:16
引用:

未記入さんの書き込み (2006-07-07 15:56) より:
MSDNで言った方法をやってみましたが、解決できない状態でした。


どう解決しなかったのか、知っているのは君だけだぞ。
それを言ってくれなきゃ前進しないことはわかるだろ。な!
未記入
会議室デビュー日: 2006/07/07
投稿数: 3
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)