ここから本文です

DataGridView マルチスレッドについて 環境 windows xp 言語 vb.n...

nic********さん

2012/6/417:56:49

DataGridView マルチスレッドについて

環境 windows xp
言語 vb.net

dv = new DataView(DataTable)
DataGridView.DataSource = dv
のようにバインドしています。

別スレッドにてDataTable自体に追加変更をしてDataGridViewに反映したいんですが、
その際にInvokeは必要なんでしょうか?

DataTable.ImportRow(row)などで追加した場合は「有効ではないスレッド間の操作」のエラーは出ないのは確認済みです。
ですが,DataGridView.Refreshなどは上記のエラーがでます。

バインドしているデータを別スレッドにて変更しているのになぜエラーが出ないのかがよくわかりません。
エラーが出ないものなんでしょうか?
エラーが出ない場合と出る場合の違いがよくわかっていません^^;

分かる方よろしくおねがいします。

閲覧数:
1,815
回答数:
1
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

順番に説明します。





[前回]

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1488516459




[DataGridView.Refreshなどの処理の件]

前回の回答で、

おはよう
おはよう
おはよう
おはよう
おはよう
こんにちは


において、「おはよう」表示に該当するのが、
「DataGridViewへのユーザーの直接操作(書き込み操作)」
等であると説明しました。
その他にも、メインスレッドで行なわれる処理が、上記例での「おはよう」表示に該当します。
もちろん、前回の補足で書かれているDataGridView.Refreshなどの処理も、上記例での「おはよう」表示に該当します。
すなわち、DataGridView.Refreshなどのメインスレッドでの処理が終わるまでは、通信処理用スレッドからのデーター書き込みを行なえません。

すなわち、「一応コントロールには、Invoke() メソッドを用意していますが、それでスレッド間通信が無理な場合は、スレッド作成の技法で、マルチスレッドに対応する仕組みを作って下さい」と言う仕様になっています。





[コントロールのマルチスレッド対応/非対応]

各種のコントロールには、Invoke()メソッドが用意されているので、コントロールはマルチスレッド対応していると思う人が多いと思います。
しかし、大半のコントロールは、マルチスレッドに対応した設計になっていません。
少なくとも、テキストボックス等のよく使われるコントロールの多くは、マルチスレッドに対応していないです(簡易的なマルチスレッド対応になっている)。
もしも、各種コントロールを、マルチスレッド対応で設計する場合は、他スレッドからのアクセスの受け付け処理を、ループで繰り返して行なう必要があります。
すなわち、受け付けをループで常時行ないます(メッセージループのイメージ)。

ただし、全てのコントロールが、上記のようなマルチスレッド対応の設計が行なわれていたら、プログラム全体の処理が重くなります。
そこで、多くのコントロールが、前回や今回で説明したような簡易的なマルチスレッド対応になっています。
すなわち、メインスレッドでの各処理が終わったタイミングで、別スレッドからのアクセスが可能になっていると言う設計になっています。





[エラーとなる場合とならない場合がある件]

本質問で書かれているDataTable.ImportRow(row)では、インポート用の機能なので、マルチスレッド対応の設計がされている可能性があります。
よって、エラーにならなかったのだと思います。
いずれにせよ、今の処理方法の場合では、「有効ではないスレッド間の操作」と言うエラーが出ているので、コントロールに用意されているスレッド機能( DataGridView.Invoke )では無理のようです。
よって、正規のマルチスレッドプログラミングで、マルチスレッド対応の仕組みを作る必要があります。
その方法は、前回での[スレッドの非同期呼び出しを行なう場合]で記した通りです。

質問した人からのコメント

2012/6/5 10:25:33

降参 大変参考になりました。^^
ありがとうございました

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる