> ドライブ単位にすると表示するまで時間がかかります。
それは当たり前でしょう。ドライブのすべてのフォルダ/ファイルを検索して
ツリーに表示しているのですから。
> 1.finder.FindFile(strWildcard);検索の時間が掛かりますか。
InsertItemの呼び出しをコメントアウトすれは、ほぼ求める時間になるでしょう。
> 2.HTREEITEM hItem = m_TreeContorol.InsertItem(str2, hParent, TVI_LAST);
Treeに登録時に時間が掛かりますか。
全体の時間から1.の計測結果を引けば、求める時間が計算できます。
もしかして
> 2.記憶した関数から引き出して、Treeを作ります。
このTreeっていうのは
> MU_COMMON* prc;
この構造体またはクラスのことをさしているの?
もしそうなら、そこの部分を提示しないと、どのように処理しないといけないかは
わからないよ。
それで、最初に出ている以下のコードについて質問するけど、
> if(FileFind.IsDirectory())
> {
> CString Stype =dir; // フォルダ
> CString IndexsName; // 名前
> IndexsName.Format( %s,%d, Stype, directory_n); //フォルダ+フォルダ番号
> SetCommonPro( m_FielDir_j, Stype, strName, IndexsName);
> directory_n++; //フォルダの数を数える
> m_FielDir_j++; //フォルダ+ファイル=総数を数える
> SearchFile(FName, ppth);
> }
> SetCommonPro( m_FielDir_j, Stype, strName, IndexsName);
このstrNameはどこで宣言していて、何が格納されているの?
> SearchFile(FName, ppth);
この関数に渡している引数はどこで宣言していて、何が格納されているの?
上記の質問に対して回答を考え、私の提示したコードと見比べてみれば、答えは
出るんじゃないかな。
PATIO さん、maruさん
ご回答ありがとう。
>上記の質問に対して回答を考え、私の提示したコードと見比べてみれば、答えは
>出るんじゃないかな。
方法1.サンプルを使って計測しました。
(格納関数が使いません)
約23秒ぐらい。
方法2.CTreeView上移しました。若干変わった。(格納関数が使いません)
void MyTreeView::OnInitialUpdate()
{
TV_INSERTSTRUCT tvstructB;
CTreeCtrl &mtreectrl = GetTreeCtrl();
//id = GetImageId( IDB_CLOSE);
tvstructB.hParent = NULL;
tvstructB.hInsertAfter = TVI_FIRST;
。。。
tvstructB.item.pszText = lpsz;
tvstructB.item.lParam = NULL;
hItemRoot2 = mtreectrl.InsertItem( &tvstructB);
Recurse_TreeView(strBuf, hItemRoot2, mtreectrl);
}
void MyTreeView::Recurse_TreeView(LPCTSTR path, HTREEITEM hParent, CTreeCtrl& mctr)
{
。。。。
HTREEITEM hItem = mctr.InsertItem( &tvstructC);
//HTREEITEM hItem = m_tree_ctrl.InsertItem(str, hParent, TVI_LAST);
if (finder.IsDirectory())
{
Recurse_TreeView(strPath, hItem, mctr);
}
}
計測結果:
システムが起動後、(パソコンの電源を入れてから)
プロジェックトを起動後~TreeView上で表示するまで約2分30秒
(この間、ハードディスクのランプが点灯しています)
一旦、終了して、もう一度プロジェックトを起動して、
TreeView上で表示するまで約18秒
何回にしても時間的に変わらない(18秒前後)
(この間、ハードディスクのランプが点灯していません、瞬間的に点灯があります)
質問:
1.方法2の場合:最初の時間が掛かりすぎた。原因が何なのでしょうか。
2.方法1の場合:約23秒より方法2の18秒多いです。
どう理解すればいいでしょうか。
3.今後、CTreeView上で実行したいのですが、最初の起動時間が掛かって、
よくないと思っています。改良の方法があるのでしょうか。
よろしくお願いします。
最初の質問の決着はついたの?
ccさんの文は助詞が変なんでわかりにくい。
> 1.方法2の場合:最初の時間が掛かりすぎた。原因が何なのでしょうか。
ドライブの全てのフォルダ/ファイルを検索している時間がかかっています。
2回目からはディスク装置のキャッシュ、OSのキャッシュ、CPUのキャッシュ
等が効き高速化されたのでしょう。
> 2.方法1の場合:約23秒より方法2の18秒多いです。
方法1と2でやってていることの違いがccさんの文章ではわかりません。
私の環境で試してみたところ、Treeコントロールへの追加ありで13.8秒、
Treeコントロールへの追加なしで11.5秒、その差は2秒強。
フォルダ数は約20,000、ファイル数は約130,000
つまり、約15万の項目が2秒強でツリーコントロールに追加できたという評価です。
ただし、これはOnInitDialog中(つまり表示を行う前)での計測結果です。
表示を行っている最中にツリーコントロールを更新した時は異なるものと思われます。
>3.改良の方法があるのでしょうか。
ありません。
ちがった! 私にはわかりません。
> 3.改良の方法があるのでしょうか。
最初に全てのフォルダ/ファイルを調べておく必要があるのでしょうか?
エクスプローラでファイルを探す場合、ルートから順番に探していきます。
フォルダがあったとき、そのフォルダを開く操作を行なうことによってその
内部が表示されます。あなたのアプリケーションがどのようなものであるか
はわかりませんが、フォルダ内の検索を後の操作によるものにすることが
できれば最初に全てのフォルダの内部まで検索する必要はないはずです。
その辺の仕様から考え直す必要があるでしょう。
ryoさん、maruさん
ご回答ありがとう。
>ccさんの文は助詞が変なんでわかりにくい。
すみません。
>最初に全てのフォルダ/ファイルを調べておく必要があるのでしょうか?
まー、ありません、
で、全てのフォルダを検索する場合があります。
実は、エクスプローラ風に作りたいのです、
左側はフォルダで、右側はファイル或いは、写真などを表示する。
質問1.
今まで、わからないことは、最初の全てのフォルダを検索しないで、
後で、必要がある時に全てのフォルダを検索すると、時間的に同じことですね。
ただ、TreeViewを先に表示してあるということ。
質問2.
エクスプローラ(OS)が瞬間的に開くのですが、そういうふうに自作の場合
できないでしょうか。
(私の場合:18秒ぐらいですが、約5秒以内できないでしょうか)
よろしくお願いします。
だ~か~ら~
> フォルダ内の検索を後の操作によるものにすることが
>できれば最初に全てのフォルダの内部まで検索する必要はないはずです。
と言ってるでしょ。
ツリーを最初に表示するときはルートのファイルとフォルダを検索してツリーに追加
する。そのままだとフォルダの前に+マークがつかないので、仮の子供(例えば.)
を追加しておく。ツリーコントロールの操作でそのフォルダが開かれたときに初めて
そのフォルダの内部を検索して子供を作成する(その時、仮の.は削除する)。
後はその繰り返し。フォルダが開かれる操作はツリーコントロールから通知メッセージ
が発行されるのでそのハンドラで処理できる。
こうすればアプリ起動時はルートを検索するだけでよい。
追記
質問2の解決
フォルダだけに検索すればいいです。
約5秒以内になりました。
maruさん
ご回答ありがとう。
いろいろ試してみます
残りが自分でやるしかない。
結局、記憶関数に追加するとこができていない。
ほんとに必要かどうか、これから考えます。
反省すること
1.Treeの全容がわかっていません。
2.finder.FindFileの流れもわかっていない
maruさんから親切に教えていただき、
ありがとうございました。