Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786

Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?

27.09.2023, 11:31. Показов 6962. Ответов 125

Всем привет! У меня есть листбокс List1 в VB6 и я пытаюсь добавить в этот список много строк, скажем 10 тысяч строк, но я хочу добавить их таким образом, чтобы они добавились быстро по времени, а не ждать целую секунду... Я этого делать не умею, поэтому помогите пожалуйста! Единственный лайфхак который я нашёл это сначала скрывать список а потом показывать так можно добавить в список много строк в 3 раза быстрее, но для 10 тысяч строк это всё равно занимает целых пол секунды времени...

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const LB_INITSTORAGE = &H1A8
Private Const LB_ADDSTRING = &H180
 
Private Sub Command1_Click()
    Dim i As Integer
    Dim tick As Long
    
    List1.Clear
    tick = GetTickCount
    
    For i = 0 To 10000
        List1.AddItem i
    Next
    Me.Caption = GetTickCount - tick ' 1311 ml
End Sub
 
Private Sub Command2_Click()
    Dim i As Integer
    Dim tick As Long
    
    List1.Clear
    tick = GetTickCount
    
    List1.Visible = False
    
    For i = 0 To 10000
        List1.AddItem i
    Next
    
    List1.Visible = True
    
    Me.Caption = GetTickCount - tick ' 468 ml
End Sub
 
 
Private Sub Command3_Click()
    Dim i As Integer
    Dim tick As Long
    Dim str As String
    Dim hwndList As Long
    
    str = "123"
    hwndList = List1.hwnd
    
    List1.Clear
    tick = GetTickCount
    
    'List1.Visible = False
    
    Debug.Print SendMessage(hwndList, LB_INITSTORAGE, 10001, CLng(LenB(str) * 10001))
    
    For i = 0 To 10000
        SendMessage hwndList, LB_ADDSTRING, 0, StrPtr(str)
    Next
    'List1.Visible = True
    
    Me.Caption = GetTickCount - tick ' 1310 ml
End Sub
Я начал читать в MSDN про сообщение LB_INITSTORAGE но у меня ничего не получилось почему-то всё равно строки в список добавляются очень медленно! Помогите плиз!

Добавлено через 24 минуты
Вопрос: почему не работает сообщение LB_INITSTORAGE?

Добавлено через 24 секунды
Скорость добавления в листбокс никак не изменилась!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.09.2023, 11:31
Ответы с готовыми решениями:

Как быстро создать список на большое количество элементов?
День добрый! Ищу информацию по такому вопросу. Например, в С++ объявить массив с сотней элементов можно простой строкой. string...

Максимально быстро записать большое количество строк SQLite
Приветствую всех. Думаю из заголовка понятно в чём вопрос как максимально эффективно и быстро записать в таблицу базы данных SQLite большое...

Как сделать так чтобы из продуктов можно было добавить в блюда и это списывалось все на кухне
Как сделать так чтобы из продуктов можно было добавить в блюда и это списывалось все на со склада

125
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 06:02  [ТС]
testuser2, приложи код! весь проект! а то только один EXE, возможно ты уже исправил ошибки, раз EXE запускается

Добавлено через 15 минут
testuser2, вообще, я очень сильно удивлён, если честно, как ты заморочился полным сканированием памяти процесса, нахождения нужной строки и полным переписыванием памяти напрямую в процесс
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 06:42  [ТС]
testuser2, вообще конечно, ковыряться в памяти - это очень интересная тема, я вот например, посмотрел через мою любимую программу ProcessHacker память твой программки EXE которую ты прислал, я запустил этот твой примерчик в EXE у меня заработал, и посмотрел память нашёл эти строки листбокса. Скрин прилагаю. Напрямую пробовал перезаписывать память через ProcessHacker и действительно строчки меняются (но не обновляются на экране). Каждая строка разделена в памяти тремя нулями в HEX это 00 00 00.
Миниатюры
Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?  
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 07:05  [ТС]
testuser2, да и кстати сообщение LB_INITSTORAGE успешно выделяет ровно столько памяти сколько ты попросишь в байтах резервирует как надо, я только что проверил и протестировал это. Ты там думал как же выделить память, так почему бы не использовать сообщение LB_INITSTORAGE а потом выделив память писать строки в уже подготовленную область!?
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,665
Записей в блоге: 2
09.05.2024, 07:38
Цитата Сообщение от HackerVlad Посмотреть сообщение
Ты там думал как же выделить память, так почему бы не использовать сообщение LB_INITSTORAGE а потом выделив память писать строки в уже подготовленную область!?
Там у меня и выделяется память с помощью CoTaskRealloc если нужно на величину, кратную 256 байт, как в оригинале. Наверное можно и сообщением. Более причесаный вариант во вложении
Всех с великим праздником!
Вложения
Тип файла: zip ListBoxTestuserAddItemsTurbo20.1.zip (17.7 Кб, 6 просмотров)
1
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,665
Записей в блоге: 2
09.05.2024, 07:56
Цитата Сообщение от HackerVlad Посмотреть сообщение
вообще, я очень сильно удивлён, если честно, как ты заморочился полным сканированием памяти процесса
Ну это конечно не очень правильно, лучше искать какие-то более прямые пути до нужных указателей. Фактически нужно вначале найти заголовочную структуру листбокса, а в ней все указатели и параметры, которые можно изменять и т.д. Но вот как добраться до этой структуры без сканирования памяти х.з. Может быть это в памяти окна и над искать ее через оконные функции, но н стаке например пишут, что это не очень просто.
1
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,665
Записей в блоге: 2
09.05.2024, 13:00
Цитата Сообщение от testuser2 Посмотреть сообщение
Ну это конечно не очень правильно
Вот более правильный вариант, ни каких дополнительных модулей, поисков строк в памяти. Все в одном модуле. Есть глючек, если 37к+ добавить строк, то ItemIndex, начинает не то выдавать, но так думаю вариант рабочий.
Вложения
Тип файла: zip New.zip (4.1 Кб, 6 просмотров)
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 14:14  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Более причесаный вариант во вложении
У меня в IDE по прежнему не работает. Возможно это из-за красивостей.

Добавлено через 4 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
Вот более правильный вариант, ни каких дополнительных модулей, поисков строк в памяти. Все в одном модуле.
Добавляется только одна строка и всё. Не работает.

Добавлено через 2 минуты
Да, не работает, из-за красивостей окон, как я и думал, как только отключаю красивости то сразу начинает работать

Добавлено через 26 секунд
С красивым окном видимо память в процессе там уже другая!!!
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,665
Записей в блоге: 2
09.05.2024, 14:21
HackerVlad, ну красивости это твои, я же твой проект брал, и просто перекидывал все файлы из проекта в проект, так на всякий случай, вдруг нужно. Я не понимаю в кастомизации вообще ни чего. Но у меня работате просто по дефолту ни чего не меняя, на 7, 8.1 и 10ке.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 14:28  [ТС]
testuser2, сейчас я тебя наглядно на картинках объясню тогда что такое красивости, раз ты не понял
Первая картинка без красовостей окон, вторая с красиостями
Миниатюры
Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?   Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?  
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 14:31  [ТС]
testuser2, так вот если окно стилизовано темой Windows (это я называю красивостями окон) то твой код уже полностью не работает и происходит вылет

Добавлено через 1 минуту
Просто у меня VB6.EXE пропатчен манифестом для красивости окон. Поэтому у меня не работает. А у тебя GUI старая некрасивая поэтому у тебя работает.

Тебе нужно сделать так чтобы работало везде. Нужно посмотреть чем отличается обычное некрасивое окно от красового.

Добавлено через 1 минуту
Сейчас попробую ещё пропатчить манифестом твой Проект1.exe, наверное сразу после этого перестанет работать.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 14:35  [ТС]
Да, как я и думал, exe пропатченное манифестом для красивостей сразу перестаёт работать
Вложения
Тип файла: zip Проект1.zip (16.7 Кб, 8 просмотров)
1
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,665
Записей в блоге: 2
09.05.2024, 14:41
И что с этим манифестом, используется уже новая версия листбокса? А драгендроп с юникодом у тебя не работает в таком окне?
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 14:57  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
И что с этим манифестом, используется уже новая версия листбокса? А драгендроп с юникодом у тебя не работает в таком окне?
Не знаю новая ли версия листбокса, но окно становится совсем другим уже. При красивостях окон сами окна меняются на другие, иногда даже ANSI'шные окна могут поменяться на юникодные, как в случае с текстовым полем в InpuBox'е например (там можно становится писать китайщину только с красивостями окон в стандартной реализации инпутбокса).

А при чём тут drag and drop? Конечно у меня всё работает. У меня всегда все окна красивые. Я люблю красивости.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 15:28  [ТС]
testuser2, ну я посмотрел свойства этих окон, без красивостей и с красивостями, не нашёл особо разницы, однако кое что всё же меняется. В окне с красивостями добавляется на пример глобальный атом "MicrosoftTabletPenServiceProperty" для тач экранов. Но это нам всё равно как бы. Потом ещё заметил в свойствах класса окна Windows Extra Bytes для окна с красиовстями 6 байт становится а без красивостей 10 байт например
Миниатюры
Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?   Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?  
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 15:35  [ТС]
Как видно если меняется размер Windows Extra Bytes значит количество байт там какой-то памяти в окне тоже меняется, память уже совсем другая. Ты посмотри лучше чем отличается структура самого листбокса в памяти. И вообще лучше найди ошибку и исправь, чтобы в красивых окнах тоже всё работало как надо.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 15:36  [ТС]
Вот
Миниатюры
Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?   Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?  
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,665
Записей в блоге: 2
09.05.2024, 16:11
Цитата Сообщение от HackerVlad Посмотреть сообщение
Ты посмотри лучше чем отличается структура самого листбокса в памяти.
Это уже надо не в своем процессе копаться, что менее удобно, чтоб посмотреть память надо обязательно ее считать, надо настраивать аппарат под такое дело. Хотя может быть там как в vba, достаточно на vba изучить, потом перенести шаблон на vb
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 16:14  [ТС]
testuser2, ты попробуй в VB6 просто запусти VB6 среду пропатченную с красивостями и увидешь что же там изменилось

Добавлено через 38 секунд
testuser2, а ты память в своём процессе записываешь обычным CopyMemory?
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,665
Записей в блоге: 2
09.05.2024, 18:44
Цитата Сообщение от HackerVlad Посмотреть сообщение
а ты память в своём процессе записываешь обычным CopyMemory?
Нет также ReadProcessMemory, но сложность действительно в другом. В vba например строки листбокса хранятся уже отдельно, в виде строк bstr, т.е. вначале буфера у них размер, указатели на эти строки хранятся в отдельных структурах по 256 байт, со смещением 32 байта. Но в этих структурах кроме этих указателей строк больше ни чего не понятно, какие-то непонятные цифры. Все по другому, на vb6 гораздо проще, но с украшательствами, я чувствую там такая же фигня.
Какая-то хрень, если под каждую строку выделяется дополнительная структура 256 байт. На 20000 строк получится
Code
1
2
3
?20000&*256
?5120000/1024/1024 
 4,8828125
целых ~5 мб.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.05.2024, 18:48  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
ReadProcessMemory
а записываешь как? WriteProcessMemory не используешь? записываешь через CopyMemory?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.05.2024, 18:48

Вывести файл на экран, чтобы в каждой строке было не больше 40 символов, и количество строк было минимальным
Дано файл f. Вывести этот файл на экран так что бы в каждой строчке было не больше, чем 40 символов и количество строк было минимальным.

Как исправить, чтобы количество столбцов и строк StringGrid было таким, как ввел пользователь
Подскажите, в чем дело, программа создает двумерный массив элементы которого вводят с клавиатуры, ввод осуществляется в stringGrid. При...

Как добавить значения с Листа в Listbox, если количество строк может меняться
Есть Лист с уже заданными значениями, но они могут изменяться (добавляться, удаляться). Нужно добавить этот столбец в Listbox. Помогите...

Как сделать так,чтобы количество строк и столбцов массива можно было менять через меню?
как сделать так,чтобы количество строк (n) и столбцов(m) массива можно было менять через меню? весь код #include...

Поиск минимального времени выполнения теста, чтобы количество набранных баллов было максимальным
Здравствуйте! Подскажите пожалуйста, в чем ошиблась у меня массив Examen структур с данными о номере Nomer. Для каждого номера дано время...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru