Соглашусь со всеми товарищами — каждый предложенный метод даст прирост производительности. Единственное что для лист контрола имеет смысл не скрывать окно, а воспользоваться специальным методом — LockWindowUpdate/UnLockWindowUpdate.
Оптимальным для 51 тысячи строк будет решение со стилем LVS_OWNERDATA. — в этом случае "добавление" (которого на самом деле нет) происходит мгновенно, и от кол-ва строк вообще не зависит.
Здравствуйте, у меня следующая проблема: мне необходимо в контролы ListBox или ListView (не принципиально), осуществить быстрое (до 500 мс) добавление двумерного массива строк: всего 51000 строк, каждая 10-20 символов. При добавлении стандартными средствами (SendMessage(hListBox, LB_ADDSTRING, (WPARAM)0, (LPARAM)array[i])) время оказывается 1-2 с на Athlon 2800+. Подскажите, пожалуйста, каким образом можно при помощи какой-либо функции, за не более 1-100 ее вызовов, добавить весь массив. Заранее благодарен.
21.09.06 20:31: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Эффективное добавление строк в ListView/ListBox
Здравствуйте, neooleg, Вы писали:
N>Здравствуйте, у меня следующая проблема: мне необходимо в контролы ListBox или ListView (не принципиально), осуществить быстрое (до 500 мс) добавление двумерного массива строк: всего 51000 строк, каждая 10-20 символов. При добавлении стандартными средствами (SendMessage(hListBox, LB_ADDSTRING, (WPARAM)0, (LPARAM)array[i])) время оказывается 1-2 с на Athlon 2800+. Подскажите, пожалуйста, каким образом можно при помощи какой-либо функции, за не более 1-100 ее вызовов, добавить весь массив. Заранее благодарен.
Можно вообще не добавлять. Воспользуйся стилем LVS_OWNERDATA (ListView).
Re: Эффективное добавление строк в ListView/ListBox
Здравствуйте, neooleg, Вы писали:
N>Здравствуйте, у меня следующая проблема: мне необходимо в контролы ListBox или ListView (не принципиально), осуществить быстрое (до 500 мс) добавление двумерного массива строк: всего 51000 строк, каждая 10-20 символов. При добавлении стандартными средствами (SendMessage(hListBox, LB_ADDSTRING, (WPARAM)0, (LPARAM)array[i])) время оказывается 1-2 с на Athlon 2800+. Подскажите, пожалуйста, каким образом можно при помощи какой-либо функции, за не более 1-100 ее вызовов, добавить весь массив. Заранее благодарен.
Не помню точно, подходит ли это для ListView, но где-то удавалось достичь повышения скорости добавления при скрывании окна перед добавлением элементов
listctrl_.ShowWindow(SW_HIDE);
// adding new items
listctrl_.ShowWindow(SW_SHOW);
--
RedApe
Re: Эффективное добавление строк в ListView/ListBox
> Здравствуйте, у меня следующая проблема: мне необходимо в контролы ListBox или ListView (не принципиально), осуществить быстрое (до 500 мс) добавление двумерного массива строк: всего 51000 строк, каждая 10-20 символов. При добавлении стандартными средствами (SendMessage(hListBox, LB_ADDSTRING, (WPARAM)0, (LPARAM)array[i])) время оказывается 1-2 с на Athlon 2800+. Подскажите, пожалуйста, каким образом можно при помощи какой-либо функции, за не более 1-100 ее вызовов, добавить весь массив. Заранее благодарен.
Насколько я помню, в ListView унутре обычный single-linked list. Поэтому если есть проблема с тормозами и заполнять надо лист целиком, то добавлять строки надо не в хвост, а в голову (в обратном порядке).
Posted via RSDN NNTP Server 2.0
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Эффективное добавление строк в ListView/ListBox
От:
Аноним
Дата:
21.09.06 11:27
Оценка:
N>Здравствуйте, у меня следующая проблема: мне необходимо в контролы ListBox или ListView (не принципиально), осуществить быстрое (до 500 мс) добавление двумерного массива строк: всего 51000 строк, каждая 10-20 символов.
Фигасе! А зачем так быстро? Думаешь кто-нибудь успеет прочитать 51000 строк на пол-секунды?
Re: Эффективное добавление строк в ListView/ListBox
Здравствуйте, neooleg, Вы писали:
N>Здравствуйте, у меня следующая проблема: мне необходимо в контролы ListBox или ListView (не принципиально), осуществить быстрое (до 500 мс) добавление двумерного массива строк: всего 51000 строк, каждая 10-20 символов. При добавлении стандартными средствами (SendMessage(hListBox, LB_ADDSTRING, (WPARAM)0, (LPARAM)array[i])) время оказывается 1-2 с на Athlon 2800+. Подскажите, пожалуйста, каким образом можно при помощи какой-либо функции, за не более 1-100 ее вызовов, добавить весь массив. Заранее благодарен.
ListBox: LB_SETCOUNT
ListView: LVM_SETITEMCOUNT
Re: Эффективное добавление строк в ListView/ListBox
Спасибо большое всем за помощь, я уже одолел эту проблему благодаря статьи о виртуальном ListView на данном сайте.
З.Ы. Извените, за тормоза с ответом.