Проблема следующая: вставка в TreeView в одну ветку большого количества элементов происходит очень долго. Использование SetRedraw(FALSE) SetRedraw(TRUE) и мало помогает. Однако Explorer открывает каталог в котором находиться 100 000 файлов очень быстро — в течении 1 секунды, тогда как код
Здравствуйте, Left2, Вы писали:
DS>>Вопрос заключается в том, как же делает это MS, что у него выходит все так быстро.
L>Смотри в сторону TVN_GETDISPINFO
Не получается. К сожалению нет виртуального treeview. Т.е. сначала все равно надо вставить _ВСЕ_ элементы, пусть даже все параметры будут callback. На это время и расходуется. TVN_GETDISPINFO поможет лишь уменьшить объем памяти, требуемый для хранения системного дерева.
DS>Не получается. К сожалению нет виртуального treeview. Т.е. сначала все равно надо вставить _ВСЕ_ элементы, пусть даже все параметры будут callback. На это время и расходуется. TVN_GETDISPINFO поможет лишь уменьшить объем памяти, требуемый для хранения системного дерева.
У тебя что — ВСЕ элементы в одной ветке ?
Иначе — лови сообщения об открытии-закрытии веток (TVN_ITEMEXPANDING) и удаляй-добавляй детей динамически
Hello, DmSh!
You wrote on Thu, 02 Oct 2003 18:28:17 GMT:
D> Проблема следующая: вставка в TreeView в одну ветку большого количества D> элементов происходит очень долго. Использование SetRedraw(FALSE) D> SetRedraw(TRUE) и мало помогает. Однако Explorer открывает каталог в D> котором находиться 100 000 файлов очень быстро — в течении 1 секунды,
Дык он файлы в дереве не показывает. Другое дело — радактор реестра.
D> тогда как код
D> for(int i=0; i<100000; i++) D> { D> tree.InsertItem(_T("Test"), 0, 0, hParent, hInsertAfter); D> }
D> выполняется секунд 10, причем, время вставки каждого нового элемента D> больше, предыдущего.
hInsertAfter чему равен? Я б попробовал TVI_FIRST, как ни странно
D> Вопрос заключается в том, как же делает это MS, что у него выходит все D> так быстро.
Не факт, что они добавляют все узлы в дерево сразу. Вполне достаточно сначала добавить только те узлы, которые видны на экране, а уже потом — остальные.
Best regards,
Sergey.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Все это мало помогает. Т.е. все равно дольше, чем у MS в аналогичной ситуации.
S>Не факт, что они добавляют все узлы в дерево сразу. Вполне достаточно сначала добавить только те
узлы, которые видны на экране, а уже потом — остальные.
Это хорошая идея, т.е. попытаться реализовать что-то вроде виртуального TreeView. Но это не так просто. Хотя, судя по Spy++ добавляют все сразу.
Думаю, что дело может быть в том, что много времени тратиться на выделение памяти и т.д. и т.п. Если бы сразу можно было подсунуть контролу нужную структуру дерева, или хотя бы как это можно в listview сразу указать ожидаемое кол-во элементов, то все гораздо быстрее.
Судя по Spy++ добавляют все сразу.
S>Best regards, S> Sergey.
Hello, DmSh!
You wrote on Fri, 03 Oct 2003 14:37:46 GMT:
S>> hInsertAfter чему равен? Я б попробовал TVI_FIRST, как ни странно
D> Ну если бы было все так просто, то не заморачивались бы люди писать свой D> контрол: http://www.codeproject.com/treectrl/rgtree.asp.
D> Все это мало помогает. Т.е. все равно дольше, чем у MS в аналогичной D> ситуации.
Я ж говорю — я проверил (как раз сегодня баг репорт на эту тему пришел). У меня время заполнения одного хитрого дерева упало с более чем 3 минут до 15 секунд. Притом что тот код помимо заполнения дерева еще кой-чего делает.
Best regards,
Sergey.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.