ボタンクリックの処理の中での、時間のかかる処理 – プログラミング – Home

ボタンクリックの処理の中での、時間のか...
 
通知
すべてクリア

[解決済] ボタンクリックの処理の中での、時間のかかる処理


Toshio
 Toshio
(@Toshio)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

C#を使って画面プログラムを開発しています。

画面上のあるボタンが押されたときに、時間のかかる10~100個くらいのファイルの送信
処理を行いますが、送信している最中に、ひとつひとつのファイル転送が終わったらその
結果(成功したか失敗したか)をリストボックスに表示したいです。

しかし、ボタン処理の中で、「1個転送してその転送結果をリストボックスに書く」とい
う処理を10回繰り返しても、結局、全部のファイル転送が終わってボタン押下のイベント
処理から抜けないと実際に画面には表示されません。

こういう場合には、どのようにすればいいのでしょうか?

結局、ファイル転送を別のスレッドにして、Formのオブジェクトを渡してリストボックス
に書く、ようなことが必要なのでしょうか?


引用未解決
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

> 結局、ファイル転送を別のスレッドにして、Formのオブジェクトを渡してリストボック

> に書く、ようなことが必要なのでしょうか?

その通りです。
さらに,別のスレッドからコントロールを操作することは許されないの
で,Control.Invokeを呼び出す必要があります。
# Control.InvokeRequiredでないなら必要ないですが。

一応,Application.DoEventsを挟むという逃げ方もありますが,細かく呼び出さないと結
局は動作がカクカクとしてしまうので,あまりお勧め出来ません。


返信引用
Toshio
 Toshio
(@Toshio)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

レス、ありがとうございます。

(ちょっとわかりにくくて難しい)delegateを使って、別スレッドから、とりあえずテキ
ストボックスに表示できましたので、これからリストボックスにさせるように変更を加え
ます。

どうも、ありがとうございました。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

Delegate.BeginInvoke使うなら,BackgroundWorkerコンポーネントの利用も考えてみた方
がよいかと思います。
# こいつの存在をすっかり忘れていました。

DoWorkイベントイベントにやりたいこと記述して,ボタンのClickイベントハンドラで
RunWorkAsyncメソッド呼び出せば良いだけなので簡単です。
ファイル名の追加も,ProgressChangedイベントを使えば処理出来ます。
DoWorkは別スレッドですが,ProgressChangedイベントとRunWorkerCompletedイベント
は,GUIスレッド側で動くので,Control.Invokeも不要になるというおまけのメリットも
あります。


返信引用
Toshio
 Toshio
(@Toshio)
ゲスト
結合: 18年前
投稿: 3
 

レス、ありがとうございます。
難しそうですが、勉強してみます。


返信引用
Toshio
 Toshio
(@Toshio)
ゲスト
結合: 18年前
投稿: 3
 

別スレッドを作成してDelegate、Invokeでとりあえず解決しましたので、いったんクロー
ズとさせていただきます。ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました