|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
||||||
Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?27.09.2023, 11:31. Показов 7229. Ответов 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
|
|
|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
||
| 11.05.2024, 13:32 [ТС] | ||
|
1
|
||
| 13.05.2024, 09:48 | |
|
HackerVlad, привет
В VBA я просто присваиваю листбоксу массив (лучше - стринговый)
0
|
|
|
Вернулся
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,801
|
|
| 13.05.2024, 15:55 [ТС] | |
|
Jack Famous, да я знаю в VB.Net тоже самое так можно, но эта тема для VB6.
Добавлено через 7 минут testuser2 дал очень хороший ответ, как напрямую в память перезаписать список строк листбокса. Но его код не на всех системах, к сожалению, будет работать. Заголовочная структура листбокса, в разных системах почему-то всегда разная. Хотя если использовать именно листбокс без красивостей, то для всех систем одинаково. И значит, что если использовать технологию testuser2 то можно уверенно сказать, что без красивостей будет работать во всех системах Windows. Но вот с красивостями уже сложнее - уже память становится совсем другая. Другими словами, если кому-то красивости не нужны, и если без манифеста, то можно спокойно быть уверенным, что во всех системах будет работать прямая перезапись памяти листбокса. Зато скорость добавления будет 32 млск даже для 100 тысяч строк добавления.
0
|
|
| 13.05.2024, 15:55 | |
|
Как исправить, чтобы количество столбцов и строк StringGrid было таким, как ввел пользователь Как добавить значения с Листа в Listbox, если количество строк может меняться
Поиск минимального времени выполнения теста, чтобы количество набранных баллов было максимальным Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|