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

時間がかかる処理でお知らせのフォーム表示

環境/言語:[Windows 7/Vista MS2010 C# Winアプリ]
分類:[.NET]

いつもお世話になります。

親から子フォームを表示する際、LAN参照の処理などで子フォームを表示してくるのが遅い場合に「しばらくお待ちください」というフォームをモードレスで表示させたいのですが、不便なことに子フォームと同時に表示してきます。

単に子フォーム表示の際、Form_Load() にxxxx.Show() では、肝心なメッセージが抜けて表示します。

下記のようにスレッドを試しましたが、不便なことに子フォームと同時に表示してきます。

何かいい方法はありませんか?

Form_Load() {
Thread trd = new Thread(new ThreadStart(this.ThreadTask));
trd.IsBackground = true;
trd.Start();
}

delegate void FocusDelegate();
private void ThreadTask()
{
Invoke(new FocusDelegate(dispWaiting));
}
void dispWaiting()
{
waiting.StartPosition = FormStartPosition.CenterParent;
waiting.Show(this);
}
■No30562に返信(hiroさんの記事)
> 親から子フォームを表示する際、LAN参照の処理などで子フォームを表示してくるのが遅い場合に
Load イベントで、時間のかかる処理を行っていませんか?
また、遅い処理というのは、具体的にはどの段階ですか?

(1) 親フォームが子フォームを表示させる前に実施する準備処理の段階
(2) 子フォームを new で作成したときのインスタンス生成時間
(3) 作成済みの子フォームインスタンスを Show するときの画面表示時間


> 「しばらくお待ちください」というフォームをモードレスで表示させたいのですが、
その時点で、モーダルで表示されているフォームは無いのですよね?


> 単に子フォーム表示の際、Form_Load() にxxxx.Show() では、肝心なメッセージが抜けて表示します。
xxxx.Show() の xxxx というのは、子フォームのインスタンスでしょうか?
ということは、この Form_Load というのは、親フォームのイベントですか?


> 何かいい方法はありませんか?
それぞれの処理をどこに設けるかにもよりますが、その長い処理というのが
UIスレッドとは分離できる(各種コントロールを読み書きしない)のであれば、
BackgroundWorker を用意して、時間のかかる処理を DoWork に行わせるようにし、

private void Foo()
{
 しばらくお待ちください.Show();
 backgroundWorker1.RunWorkerAsync("初期化データ");
}

private void backgroundWorker1_RunWorkerCompleted(…
{
 処理結果 = e.Result;
 子フォーム f = new 子フォーム( 処理結果 );
 子フォーム.Shown += delegate { しばらくお待ちください.Close(); };
}

という感じで如何でしょう。
魔界の仮面弁士様、お世話になりました。
そして、返事が大変遅くなりました。
結果、教えていただいた内容で解決しました。

>>親から子フォームを表示する際、LAN参照の処理などで子フォームを表示してくるのが遅い場合に
> Load イベントで、時間のかかる処理を行っていませんか?
> また、遅い処理というのは、具体的にはどの段階ですか?
行ってます。ネットワークにつながっている名前を調べています。
DirectoryEntry ParentEntry = new DirectoryEntry();
List<string> pc = new List<string>();

try {
ParentEntry.Path = "WinNT:";
foreach (DirectoryEntry childEntry in ParentEntry.Children) {
switch (childEntry.SchemaClassName) {
case "Domain":
DirectoryEntry SubParentEntry = new DirectoryEntry();
SubParentEntry.Path = "WinNT://" + childEntry.Name;

:
:
のため、少しの間、フリーズ状態になってます。
そのため、「お待ちください」を表示したかったです。
backgroundWorker1は、思いつきませんでした。

これを実装するに当たり、キャンセル部分に苦労(勘違いがあり)して遅くなりました。

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

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