|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||
Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?27.09.2023, 11:31. Показов 7037. Ответов 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
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 11.05.2024, 13:32 [ТС] | ||
|
1
|
||
| 13.05.2024, 09:48 | |
|
HackerVlad, привет
В VBA я просто присваиваю листбоксу массив (лучше - стринговый)
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 13.05.2024, 15:55 [ТС] | |
|
Jack Famous, да я знаю в VB.Net тоже самое так можно, но эта тема для VB6.
Добавлено через 7 минут testuser2 дал очень хороший ответ, как напрямую в память перезаписать список строк листбокса. Но его код не на всех системах, к сожалению, будет работать. Заголовочная структура листбокса, в разных системах почему-то всегда разная. Хотя если использовать именно листбокс без красивостей, то для всех систем одинаково. И значит, что если использовать технологию testuser2 то можно уверенно сказать, что без красивостей будет работать во всех системах Windows. Но вот с красивостями уже сложнее - уже память становится совсем другая. Другими словами, если кому-то красивости не нужны, и если без манифеста, то можно спокойно быть уверенным, что во всех системах будет работать прямая перезапись памяти листбокса. Зато скорость добавления будет 32 млск даже для 100 тысяч строк добавления.
0
|
|
| 13.05.2024, 15:55 | |
|
Как исправить, чтобы количество столбцов и строк StringGrid было таким, как ввел пользователь Как добавить значения с Листа в Listbox, если количество строк может меняться
Поиск минимального времени выполнения теста, чтобы количество набранных баллов было максимальным Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|