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

わんくま同盟

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

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


(過去ログ 17 を表示中)
■6793 / )  Re[5]: 別スレッドでShowDialogしたフォームのクローズ
□投稿者/ れい (52回)-(2007/08/23(Thu) 21:20:57)
2007/08/23(Thu) 21:23:57 編集(投稿者)
2007/08/23(Thu) 21:22:42 編集(投稿者)

No6772 (まどか さん) に返信
> fm2は別スレッドで作成したのだから
>> '// Form2に1行表示
>> Private Sub WriteLine(ByVal text As String)
> これこそInvokeする必要があるのでは。
>> '// リッチテキストボックスに文字を追記表示する
>> Public Sub WriteLine(ByVal text As String)
> こっちは自分自身の操作だからInvokeは要らないのでは。

そんなことはないですよ。
Formのメンバを呼ぶときに作成元スレッドであればいいので、
WriteLineでチェックするやり方もアリです。
そのほうが綺麗になる場合が多い。

No6760 (困ったちゃん さん) に返信
> 書き込み処理中にForm2のクローズボックスをクリックすると、Invokeのところで凍りついてしまいます。
> どこに問題があるのでしょうか。

フォームが閉じて作成元スレッドはメッセージを読みにいかなくなるのに
他のスレッドがInvokeでメッセージを送り、完了を待つからです。

No6791 (まどか さん) に返信
> というか本来言いたいことはそうではなくて
> 普通は時間のかかる「処理」を別スレッド化して、GUIメインスレッドは通常の入力待ち状態(普通にフォームが表示されている状態)にさせます。
> で、スレッドからの通知を受けて表示を更新します。
> 下記にて、まずはやろうとしていることとの違いというか一般的な形を試してみるとよいと思います。

まどかさんのおっしゃるように、
GUIはGUIスレッドに、処理は処理用のスレッドに、というのが普通です。
ですが、コンポーネント化などの都合で、違う方法をとることもあります。
今回のようなパターンも、有効な場合もあります。

Invokeではなく、
BeginInvokeにすれば完了を待たないので解決するかと思います。
また、その方がパフォーマンスも優れているはずです。
WriteLineしてる間処理ができないのはもったいないですから。

注意点は、
BeginInvokeだと完了を待たないので戻り値を取得できませんし、
Invoke先がきちんと完了したかわかりません。
また、前回の完了もわからないので、
たくさん呼ぶとキューにたくさん溜まります。
メッセージキューを使ってるので、あまりたくさん溜められません。
返信 編集キー/


管理者用

- Child Tree -