|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
||||||
Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?27.09.2023, 11:31. Показов 8110. Ответов 125
Всем привет! У меня есть листбокс List1 в VB6 и я пытаюсь добавить в этот список много строк, скажем 10 тысяч строк, но я хочу добавить их таким образом, чтобы они добавились быстро по времени, а не ждать целую секунду... Я этого делать не умею, поэтому помогите пожалуйста! Единственный лайфхак который я нашёл это сначала скрывать список а потом показывать так можно добавить в список много строк в 3 раза быстрее, но для 10 тысяч строк это всё равно занимает целых пол секунды времени...
Добавлено через 24 минуты Вопрос: почему не работает сообщение LB_INITSTORAGE? Добавлено через 24 секунды Скорость добавления в листбокс никак не изменилась!
0
|
||||||
| 27.09.2023, 11:31 | |
|
Ответы с готовыми решениями:
125
Как быстро создать список на большое количество элементов? Максимально быстро записать большое количество строк SQLite Как сделать так чтобы из продуктов можно было добавить в блюда и это списывалось все на кухне |
| 11.05.2024, 06:54 | ||||||||||||||||||||||||||||||||
|
HackerVlad, спасибо за подробную инструкцию, вижу с кириллицей там не работает, но это не суть важно, еще не очень понятно как получить адрес найденной строки, наверное как-то вычислять.
Сначала пишем такую процедуру
Проверяем смещения между буферами строк ?8552786-8552768 18 ?8552808-8552786 22 Видим, что буферы фактически находятся рядом Первая строка у нас 8*2 = 16 байт, если добавить нуль - еще +2 поолучится 18, вторая строка 10*2+2 = 22. Все сходится строки лежат в одном буфере, разделенные 2байтным нулем. Теперь цикл можно убрать и оставить вычисление указателей только для первой строки. Далее нас интересуют параметры локаций (выделенной памяти), в которых расположен буфер и заголовок.
Адрес заголовка строки pHdr, не совпадает с началом своей локации, а смещен от начала на 48 байт
Все выше-описаное вероятно хранится в локации/структуре заголовка, чтобы это выяснить мапим массивы типа long и integer на локацию заголовка. Сразу скажу, что все обнаружилось в лонг-массиве, там все параметры оказались четко по 4байтовой "сетке".
1
|
||||||||||||||||||||||||||||||||
| 11.05.2024, 09:11 | ||||||
|
Как видим на скрине, в 12 элементе массива значение равное pBuf указатель на буфер строк по смещению 48 байт. В 8 элементе цифра 3, которая равна числу добавленных элементов. В 14 элементе число 256, равное ранее выясненому размеру локации буфера. В 15 - число равное общей длине всех строк с нулями: (8+10+16)*2+2*3 = 54.
Все очень легко проверить, когда код стоит на стопе, в Immediate вводим ?oList.AddItem "gfgfg" и видим как меняются значения в 8 и 15 элементах. Где-то должна быть информация об смещениях строк, подозрение сразу падает на указатель в lArr(10) и число 32 рядом с ним. Получаем информацию об этом указателе и мапим на него массив.
Дальше оставалось только продумать алгоритм добавления строк и прописывания всех параметров в заголовочную структуру. Потом еще идея пришла использовать HeapWalk для поиска указателей, более компактно и быстро.. Однако HeapWalk это конечно вещь специфическая, она требует блокировки кучи, на время ее работы, однако работает очень быстро (пример использования, кстати, брал у Трика), но есть некоторые сомнения в абсолютной надежности ее работы.
1
|
||||||
| 11.05.2024, 09:20 | |
|
Когда искал, пример использования HeapWalk, то нашел это у The trick-а, в его блоге, там запись, кстати была тоже про Листбокс https://www.cyberforum.ru/blog... g2329.html
1
|
|
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
||
| 11.05.2024, 13:32 [ТС] | ||
|
1
|
||
| 13.05.2024, 09:48 | |
|
HackerVlad, привет
В VBA я просто присваиваю листбоксу массив (лучше - стринговый)
0
|
|
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|
| 13.05.2024, 15:55 [ТС] | |
|
Jack Famous, да я знаю в VB.Net тоже самое так можно, но эта тема для VB6.
Добавлено через 7 минут testuser2 дал очень хороший ответ, как напрямую в память перезаписать список строк листбокса. Но его код не на всех системах, к сожалению, будет работать. Заголовочная структура листбокса, в разных системах почему-то всегда разная. Хотя если использовать именно листбокс без красивостей, то для всех систем одинаково. И значит, что если использовать технологию testuser2 то можно уверенно сказать, что без красивостей будет работать во всех системах Windows. Но вот с красивостями уже сложнее - уже память становится совсем другая. Другими словами, если кому-то красивости не нужны, и если без манифеста, то можно спокойно быть уверенным, что во всех системах будет работать прямая перезапись памяти листбокса. Зато скорость добавления будет 32 млск даже для 100 тысяч строк добавления.
0
|
|
| 13.05.2024, 15:55 | |
|
Как исправить, чтобы количество столбцов и строк StringGrid было таким, как ввел пользователь Как добавить значения с Листа в Listbox, если количество строк может меняться
Поиск минимального времени выполнения теста, чтобы количество набранных баллов было максимальным Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки.
Добавлено:
- Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|