C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 別スレッドからのUI操作


(過去ログ 79 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■47105 / inTopicNo.1)  別スレッドからのUI操作
  
□投稿者/ asuka (9回)-(2010/02/18(Thu) 14:21:44)

分類:[C#] 

お世話になっております。

早速ですが、メインフォームのコントロールを別スレッドから操作しようとすると安全でないアクセスのため例外が発生します。
→Thread(),ThreadPool(),BackgroundWorker_DoWork()

BackgroundWorker()においては、DoWork()でなく、Complete()内で操作すれエラーは出ないのですが、処理が重いため避けたいと思っております。
 ・DoWork - 別スレッドで実行
 ・Complete - メインスレッドで実行

プログラムの概要ですが、FTP機能を実装したプログラムで、メインフォーム上にリストビュー(detail表示)があり、指定したディレクトリ内のファイルが表示されております。

ファイル選択後(複数可)、[アップロード]ボタン押下でサーバへファイルを転送します。



[アップロード]ボタン押下後、BackgroundWorker.RunWorkerAsync()をコールし、DoWork()内にて選択されたリストビューのインデックスを取得するため下記の処理を行っております。

foreach (ListViewItem lvItem in listViewClientDir.SelectedItems)
{
 //Tagからフルパス取得
//アップ先URI作成
 //アップロード
}

listViewClientDir.SelectedItemsの部分が安全でないアクセスのため例外が発生します。



リストビューのカウントを数えるのであれば、下記デリゲートを宣言して、
private delegate int delGetLVClientItemsCount();
private int callback_GetLVClientItemsCount()
{
return listViewClientDir.Items.Count;
}

DoWork()内から
delGetLVClientItemsCount callbackGetLVClientCount =
 new delGetLVClientItemsCount(callback_GetLVClientItemsCount);
int nLVCnt = (int)Invoke(callbackGetLVClientCount);
MessageBox.Show(nLVCnt.ToString());

とすることで正しいカウント数が得られるのですが、選択されているかの情報はどのように取得すればよいでしょうか?

下記でエラーが発生します。
foreach ステートメントは、'System.Windows.Forms.ListViewItem' が 'GetEnumerator' のパブリック定義を含んでいないため、型 'System.Windows.Forms.ListViewItem' の変数に対して使用できません。

//デリゲート宣言
private delegate ListViewItem delGetLVClientSelectedItems();
private ListViewItem callback_GetLVClientSelectedItems()
{
ListViewItem lvItem = null;
foreach (ListViewItem lv in listViewClientDir.SelectedItems) { lvItem = lv; }
return lvItem;
}

//DoWork()内
foreach (ListViewItem lvItem in (ListViewItem)Invoke(callbackGetLVClientSelectedItems))


ご教授頂ければ幸いです。
---
VS2005 SP1 C#
引用返信 編集キー/
■47111 / inTopicNo.2)  Re[1]: 別スレッドからのUI操作
□投稿者/ なちゃ (395回)-(2010/02/18(Thu) 16:31:54)
選択されたデータの取り出しまではボタンのハンドラで行って、
取り出したデータリストをRun〜に渡すようなやり方の方がいいと思います。
引用返信 編集キー/
■47112 / inTopicNo.3)  Re[2]: 別スレッドからのUI操作
□投稿者/ asuka (10回)-(2010/02/18(Thu) 17:06:30)
お返事ありがとうございます。

2行でズバリですね、はぃ、、、

そんな気がしてきて、構造体作ってアップロードするデータため込んでスレッドの引数として渡そうと思い始めました・・・

ただ、もしも参照するやり方があれば勉強のために教えて頂ければ幸いです。
引用返信 編集キー/
■47116 / inTopicNo.4)  Re[3]: 別スレッドからのUI操作
□投稿者/ なちゃ (396回)-(2010/02/18(Thu) 17:35:18)
DoWork内で列挙するのは基本的に無理です。
※例えできたとしても、いくつかの理由からやるべきではありません

ですので、やるとしたらInvokeしたメソッド内で列挙することになります。

まあ結局、最初に列挙して渡す方が無難という結論になります。

引用返信 編集キー/
■47149 / inTopicNo.5)  Re[4]: 別スレッドからのUI操作
□投稿者/ asuka (11回)-(2010/02/19(Fri) 10:17:27)
なちゃさん。

ご指摘頂いた通り、スレッドをコールする前にメインスレッドにて必要な情報を列挙して取得することで解決致しました。

ありがとうございます。
m(__)m

引用返信 編集キー/
■47150 / inTopicNo.6)  Re[5]: 別スレッドからのUI操作
□投稿者/ asuka (12回)-(2010/02/19(Fri) 10:17:32)
No47149 (asuka さん) に返信
> なちゃさん。
>
> ご指摘頂いた通り、スレッドをコールする前にメインスレッドにて必要な情報を列挙して取得することで解決致しました。
>
> ありがとうございます。
> m(__)m
>
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -