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

MIDフォームとBackGroundWorker

環境/言語:[WindowsXP SP2/VB2005/.NET Framework 2.0]
分類:[.NET]

根本的な質問で申し訳ないのですが、MDI 子フォームは
互いに別スレッドで処理が行われるのでしょうか?
それとも、一つの子フォームで処理をしている間は、その処理が終わるまで
他の子フォーム・親フォームは処理できないのでしょうか。

現在、複数のドキュメントを管理するアプリケーションを作っています。
個人情報(住所・氏名・年齢・性別・趣味・メモ)を複数まとめて
一つのドキュメント(住所録)とし、その住所録を複数管理する
アプリケーションです。

アプリケーション内では、同時に複数のドキュメント(住所録)を
開けるようにしたいと考えています。
この場合、やはり MDI フォームを使った方がいいのでしょうか?
MDI フォームを使ったことがなくて、よくわからない状態です。

また、1枚のドキュメント(住所録)内では、そのドキュメント(住所録)の
・「編集」
・「保存」
・「閉じる」
・「開く」
・「自動リスト読込み」(外部ファイルから情報を読み込んで、住所録を自動生成する。) ←処理に時間がかかる

の操作をしたいと考えています。1枚のドキュメントで「自動リスト読込み」(時間のかかる処理)をしている間、他のドキュメントで作業をできるようにしたいです。MDI 子ウインドウを用いれば、他の子ウインドウでの処理とは別に、独立して処理を行う仕組みがあるのでしょうか?

それとも、自分でマルチスレッド処理を実装しなければならないのでしょうか?
先ほどまで、BackGroundWorker について調べていたのですが、MDI フォームについても知りたくなり、質問させていただきました。

どなたか、お詳しい方いらっしゃいましたらご教授願えませんでしょうか。
仕事上で納期もほとんどなく責任を一人で負わされ困っています・・・
■No23647に返信(迷い犬さんの記事)
> 根本的な質問で申し訳ないのですが、MDI 子フォームは
> 互いに別スレッドで処理が行われるのでしょうか?

いいえ。
特に何もしなければWindowsアプリケーションではメインスレッドという一つの土台上で動きます。
つまり、すべてが同期処理になり実行中のプロシージャ以外は待ち状態になります。
#Frameworkの内部仕様は除きます

> それとも、一つの子フォームで処理をしている間は、その処理が終わるまで
> 他の子フォーム・親フォームは処理できないのでしょうか。

フォームという単位ではありません。
イベントドリブンですからWindowsがメッセージを通知してきて、それに反応して何かが動き始めます。
そしてその他が待ち状態になる期間はその動いているプロシージャのEnd Subに達するまでです。
処理中にボタンをクリックしてもすぐに反応しないのはそのためです。
#フォームが描画されず真っ白になるのは描画のメッセージが来ているのに処理できないためです。
#応答なしとはWindowsがメッセージを送ったのに返事が無いということです。
#Windowsがメッセージ通知先の関数を呼び出したが処理が実行されないのでReturn文で結果が返ってこないというイメージ

> アプリケーション内では、同時に複数のドキュメント(住所録)を
> 開けるようにしたいと考えています。
> この場合、やはり MDI フォームを使った方がいいのでしょうか?
> MDI フォームを使ったことがなくて、よくわからない状態です。

MDIの性質としては、個々の子フォームがお互いに関知せず独立していることが必要です。
#考え方として
これが満たされていないと自然とMDIの見た目に自身でも違和感を覚えると思います。

> 1枚のドキュメントで「自動リスト読込み」(時間のかかる処理)をしている間、他のドキュメントで作業をできるようにしたいです。MDI 子ウインドウを用いれば、他の子ウインドウでの処理とは別に、独立して処理を行う仕組みがあるのでしょうか?

先に書いたように「いいえ」ということになります。

> それとも、自分でマルチスレッド処理を実装しなければならないのでしょうか?

そういうことになります。


> 仕事上で納期もほとんどなく責任を一人で負わされ困っています・・・

この手のことは文章全体およびあなたの印象を変えてしまいます。
気持ちはわかりますが書かない方がよいです。
#見ている人は「急いでいるんだ」と受け取ってしまいます
■No23648に返信(まどかさんの記事)

まどか様
ご教授有難うございますm(。_。)m
とてもご丁寧にご回答いただき感謝です。

知りたかったことをずばり教えていただき、有難うございました。
よくわかりました。
また、イベントドリブンについてもお教え頂き有難うございます。
まだまだ勉強し足りないことが多いことがわかりました。
MDI 子フォーム上で処理をしていても、通常のフォームと同様、
実行中のプロシージャが終わるまで他の処理は行われない、という
イメージで自分なりに解釈できました。

>>アプリケーション内では、同時に複数のドキュメント(住所録)を
>>開けるようにしたいと考えています。
>>この場合、やはり MDI フォームを使った方がいいのでしょうか?
>>MDI フォームを使ったことがなくて、よくわからない状態です。
>
> MDIの性質としては、個々の子フォームがお互いに関知せず独立していることが必要です。
> #考え方として
> これが満たされていないと自然とMDIの見た目に自身でも違和感を覚えると思います。

有難うございます。とても勉強になります。
アプリケーションの設計上、理論上は、子フォーム同士を関知しない作りに
できるのですが、要件定義の段階で MDI を念頭においていなかったため、
親フォームを頼る機能なのか子フォーム同士が関知してしまうのか、
機能の設計が曖昧なままになっていました。

再度案を練り直して、できれば MDI を使う方向で考えてみたいと思います。

>>1枚のドキュメントで「自動リスト読込み」(時間のかかる処理)をしている間、他のドキュメントで作業をできるようにしたいです。MDI 子ウインドウを用いれば、他の子ウインドウでの処理とは別に、独立して処理を行う仕組みがあるのでしょうか?
>
> 先に書いたように「いいえ」ということになります。
>
>>それとも、自分でマルチスレッド処理を実装しなければならないのでしょうか?
>
> そういうことになります。

BackGroundWorker を駆使して、マルチスレッド処理も実装して
いきたいと思います。
本当にありがとうございました。


>>仕事上で納期もほとんどなく責任を一人で負わされ困っています・・・
>
> この手のことは文章全体およびあなたの印象を変えてしまいます。
> 気持ちはわかりますが書かない方がよいです。
> #見ている人は「急いでいるんだ」と受け取ってしまいます

確かに、おっしゃる通りでした。
やはりプログラミングは楽しいと思います。
それで進んできた道なので、腰を据えて、また素直に学びながら、
よりいいものを作れるようスキルアップしていきたいと思います。
有難うございました。
解決済み!

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