Медленный TreeView
От: DmSh Россия  
Дата: 02.10.03 18:28
Оценка:
Проблема следующая: вставка в TreeView в одну ветку большого количества элементов происходит очень долго. Использование SetRedraw(FALSE) SetRedraw(TRUE) и мало помогает. Однако Explorer открывает каталог в котором находиться 100 000 файлов очень быстро — в течении 1 секунды, тогда как код

for(int i=0; i<100000; i++)
{
tree.InsertItem(_T("Test"), 0, 0, hParent, hInsertAfter);
}

выполняется секунд 10, причем, время вставки каждого нового элемента больше, предыдущего.

На codeproject есть статья на эту тему http://www.codeproject.com/treectrl/rgtree.asp. Но там контрол не поддерживает очень многих функций стандартного treeview.

Вопрос заключается в том, как же делает это MS, что у него выходит все так быстро.
Re: Медленный TreeView
От: Left2 Украина  
Дата: 03.10.03 07:29
Оценка:
DS>Вопрос заключается в том, как же делает это MS, что у него выходит все так быстро.

Смотри в сторону TVN_GETDISPINFO
Re[2]: Медленный TreeView
От: DmSh Россия  
Дата: 03.10.03 10:16
Оценка:
Здравствуйте, Left2, Вы писали:

DS>>Вопрос заключается в том, как же делает это MS, что у него выходит все так быстро.


L>Смотри в сторону TVN_GETDISPINFO


Не получается. К сожалению нет виртуального treeview. Т.е. сначала все равно надо вставить _ВСЕ_ элементы, пусть даже все параметры будут callback. На это время и расходуется. TVN_GETDISPINFO поможет лишь уменьшить объем памяти, требуемый для хранения системного дерева.
Re[3]: Медленный TreeView
От: Left2 Украина  
Дата: 03.10.03 10:41
Оценка:
DS>Не получается. К сожалению нет виртуального treeview. Т.е. сначала все равно надо вставить _ВСЕ_ элементы, пусть даже все параметры будут callback. На это время и расходуется. TVN_GETDISPINFO поможет лишь уменьшить объем памяти, требуемый для хранения системного дерева.

У тебя что — ВСЕ элементы в одной ветке ?
Иначе — лови сообщения об открытии-закрытии веток (TVN_ITEMEXPANDING) и удаляй-добавляй детей динамически
Re: Медленный TreeView
От: Sergey Россия  
Дата: 03.10.03 11:03
Оценка:
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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Медленный TreeView
От: Sergey Россия  
Дата: 03.10.03 11:53
Оценка:
Hello, Sergey!
You wrote on Fri, 03 Oct 2003 11:03:06 GMT:

S> hInsertAfter чему равен? Я б попробовал TVI_FIRST, как ни странно


Во, сам попробовал — квадратичная сложность c TVI_LAST поменялась на линейную с TVI_FIRST.


Best regards,
Sergey.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Медленный TreeView
От: DmSh Россия  
Дата: 03.10.03 14:37
Оценка:
Здравствуйте, Sergey, Вы писали:

S>hInsertAfter чему равен? Я б попробовал TVI_FIRST, как ни странно


Ну если бы было все так просто, то не заморачивались бы люди писать свой контрол: http://www.codeproject.com/treectrl/rgtree.asp.

Все это мало помогает. Т.е. все равно дольше, чем у MS в аналогичной ситуации.

S>Не факт, что они добавляют все узлы в дерево сразу. Вполне достаточно сначала добавить только те

узлы, которые видны на экране, а уже потом — остальные.

Это хорошая идея, т.е. попытаться реализовать что-то вроде виртуального TreeView. Но это не так просто. Хотя, судя по Spy++ добавляют все сразу.

Думаю, что дело может быть в том, что много времени тратиться на выделение памяти и т.д. и т.п. Если бы сразу можно было подсунуть контролу нужную структуру дерева, или хотя бы как это можно в listview сразу указать ожидаемое кол-во элементов, то все гораздо быстрее.

Судя по Spy++ добавляют все сразу.

S>Best regards,

S> Sergey.
Re[3]: Медленный TreeView
От: Sergey Россия  
Дата: 03.10.03 14:54
Оценка:
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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.