DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームのコントロールを別スレッドに渡したい

環境/言語:[C#]
分類:[.NET]

フォームのリストボックスを別スレッドで更新する場合、本サイトのサンプル
を参考にしてうまくいきました。(フォームの記述とスレッドの記述が同じファイル)
が、スレッドの記述を別ファイル(.cs)にする場合
はスレッドにリストボックスコントロールを教えてやる必要があると思い、
スレッドファイル内に

public System.Windows.Forms.ListBox dateListBox1;
//デリゲートの宣言
public delegate void myDrawDelegate();
myDrawDelegate Mydlg;
に記述し、

フォーム側で
スレッドのインスタンス(myThread)をつくり
myThread.dateListBox1 = listBox1;
でセットし、スレッド起動しました。

ところがリストボックスを書き換えるモジュールで
if (dateListBox1.InvokeRequired)
の部分で実行時にスタックオーバーフローが起きて
うまくいきません。

他に方法がありますか?
2006/10/16(Mon) 10:54:27 編集(投稿者)

■No17840に返信(斉藤 昇さんの記事)

こんにちは エツです。
フォームのコントロールをスレッドから更新する場合は Invoke を使用して
更新します。
この場合、「スレッドにコントロールを渡す」というより、「コントロールのあるスレッドに一時的に制御を移して更新し、再びスレッドに戻る」というイメージです。



> フォームのリストボックスを別スレッドで更新する場合、本サイトのサンプル
> を参考にしてうまくいきました。(フォームの記述とスレッドの記述が同じファイル)

参考にしたサンプルが判らないので何ともいえませんが、うまくいったのなら

> が、スレッドの記述を別ファイル(.cs)にする場合...

これでもうまくいくと思いますが?
違う点は別ファイルなので 参照、スコープ、名前空間、クラス名、インスタンス、等を
適当に修正する必要があると思います。


以下の方法につきましては、必要かどうか私にはわかりませんので
コメントは控えさせて、頂きます。



> はスレッドにリストボックスコントロールを教えてやる必要があると思い、
> スレッドファイル内に
>
> public System.Windows.Forms.ListBox dateListBox1;
> //デリゲートの宣言
> public delegate void myDrawDelegate();
> myDrawDelegate Mydlg;
> に記述し、
>
> フォーム側で
> スレッドのインスタンス(myThread)をつくり
> myThread.dateListBox1 = listBox1;
> でセットし、スレッド起動しました。
>
> ところがリストボックスを書き換えるモジュールで
> if (dateListBox1.InvokeRequired)
> の部分で実行時にスタックオーバーフローが起きて
> うまくいきません。
>
> 他に方法がありますか?
>
>


#私もデザインモードで作成したフォームのリストボックスにスレッドで作成した文字列を
スレッドからリストボックスに追加しましたが、上手く追加できます。
但しこれは同一クラスのリストボックスとスレッドの場合です。
別クラスでは試していません。

DOBON.NET | プログラミング道 | プログラミング掲示板