12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
1 | |
ListCtrl большое количество InsertItem04.12.2019, 19:48. Показов 2461. Ответов 35
Метки нет (Все метки)
Привет ребята. Может кто нибудь подскажет или хотя бы приблизительное знает как с таким можно бороться.
Я в программе разбиваю файл на определенные строчки. Строчек получается много. Потом в цикле для каждой строчки делаю InsertItem. Пока файлы килобайтные, все прекрасно. Но если фал несколько мегабайт, то процедура вставки итемов начинает занимать неприлично много времени. Такой программой пользоваться становиться очень неудобно и раздражительно. Причем я поубирал все функции, большее количество времени уходит именно на цикл вставки итемов. Как с этим справиться?
0
|
04.12.2019, 19:48 | |
Ответы с готовыми решениями:
35
Количество дней, когда выпало самое большое количество осадков Интересное поведение CListCtrl::InsertItem() QListWidget insertItem вставка строки в нужное место большое количество точек |
04.12.2019, 20:08 | 2 |
Eсли программа - не плеер музыки, то подобный код, лично я, занесу в чёрный список и не буду пользоваться.
Как совет: Лучше создать несколько списков или динамически перегружать один по мере навигации в нём. Например, словарь «Сократ» имеет запас в сотни тысяч строк в списке, но отображает не больше сотни с динамической подгрузкой…
0
|
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
|
|
04.12.2019, 20:18 | 3 |
zombivadim, а при чём тут размер файлов? Вставка названий будет моментальная
Или поточнее расскажи, что там у тебя происходит
0
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
04.12.2019, 20:21 [ТС] | 4 |
Alikberov, Посмотрите любой хекс редактор прекрасно справляется с такой задачей, и бесит что я не понимаю как они это сделали.
Добавлено через 1 минуту Каждая строчка в отдельную ячейку.
0
|
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
|
|
04.12.2019, 20:22 | 5 |
zombivadim, а, ну так понятно. Фокус в том, что не нужно полностью весь файл пихать в контрол, нужно отображать только ту часть, которая видна на экране
0
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
04.12.2019, 20:22 [ТС] | 6 |
0
|
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
|
|
04.12.2019, 20:22 | 7 |
Qt-шная модель таблицы хорошо это реализует. Я себе по такому же принципу сделал таблицу на MFC
0
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
04.12.2019, 20:23 [ТС] | 8 |
0
|
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
|
|
04.12.2019, 20:24 | 9 |
не нужны там никакие InsertItem. Стандартный контрол не предназначен для просмотра больших списков
Добавлено через 1 минуту сделай в контроле столько строк, сколько помещается на экране. А вот содержимое будет зависеть от полосы прокрутки - как бы такое окно-рамочка по длинному списку едет и отображает только то, что в рамочку попало
0
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
04.12.2019, 20:29 [ТС] | 10 |
Алексей1153, А в сторону каких мне функций смотреть что бы сделать подобное, никогда с таким не сталкивался еще.
0
|
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
|
|
04.12.2019, 20:32 | 11 |
zombivadim, да я вот так сходу и не скажу, я на чистом апи не делаю ничего давно, MFC да Qt
экспериментируй, читай доки. По любому придётся свою полосу прокрутки приделывать, потому что встроенная не подойдёт для такой задачи. От положения ползунка вычисляешь, какая строка в данных должна быть показана первой, потом отсчитываешь количество строк, помещающееся на экране. И это количество строк заполняешь
0
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
04.12.2019, 20:37 [ТС] | 12 |
0
|
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
|
|
04.12.2019, 20:39 | 13 |
zombivadim, в Qt есть https://doc.qt.io/qt-5/qabstractitemmodel.html
в MFC не встречал. Может, в новых версиях чего прилепили
0
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
04.12.2019, 20:49 [ТС] | 14 |
Алексей1153, Мда с ходу и быстро такое решить не получится......
Добавлено через 5 минут А вот в списке добавляемых элементов в MFC есть всякие MFC ShellList Control , MFC ShellTree Control, для чего они?
0
|
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
|
|
04.12.2019, 20:50 | 15 |
zombivadim, ну почему же. Попробовать-пощупать быстродействие концепции можно очень быстро:
имеется список данных на 10000 строк. берёшь ListCtrl , задаёшь ему размер, скажем, 15 строк. Больше этот размер не трогаешь. рядом на форме две кнопки - вверх и вниз. По нажатию вверх переменная topRow увеличивается, при нажатии вниз - уменьшается. Границы 0...9999 при каждом изменении значения topRow перезаполняешь таблицу, взяв из данных записи, которые начинаются с topRow и всего 15 штук. Добавлено через 39 секунд видимо, список и дерево )
0
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
04.12.2019, 20:59 [ТС] | 16 |
Не я думал может из этих элементов MFC.. есть что то подходящие)
А почему стандартный ползунок не подойдет, от него нет уведомлений о прокрутке?
0
|
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
|
|
04.12.2019, 21:05 | 17 |
если в списке будет всего 15 строк, то ползунок так же будет лишь на 15 позиций
0
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
04.12.2019, 21:19 [ТС] | 18 |
Дошло. Вы знаете вначале у меня была такая мысль, а может возможно заранее создать контрол в котором уже несколько тысяч строк. И использовать его уже как шаблон. Но судя по всему такое невозможно.
0
|
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
|
|
04.12.2019, 21:24 | 19 |
zombivadim, в контроле не нужно строк больше, чем поместится на экране. Заодно и тормозить не будет.
Я свою таблицу вообще полностью рисовал, у меня там и тексты цветные, все дела. Работает шустро, хоть 10 миллионов строк отображай Добавлено через 42 секунды zombivadim, в контроле не нужно строк больше, чем поместится на экране. Заодно и тормозить не будет. Я свою таблицу вообще полностью рисовал, у меня там и тексты цветные, все дела. Работает шустро, хоть 10 миллионов строк отображай
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
04.12.2019, 22:47 | 20 |
Сообщение было отмечено zombivadim как решение
Решение
Здесь тебе надо воспользоваться вот такой штукой - Creating a Virtual List-View Control, LVS_OWNERDATA.
Пробежаться по файлу и начитать в массив смещение и размер строк, это займёт относительно немного памяти. По сообщениям LVN_ODCACHEHINT начитывать эти строки их файла.
1
|
04.12.2019, 22:47 | |
04.12.2019, 22:47 | |
Помогаю со студенческими работами здесь
20
Большое количество строк Большое количество команд Большое количество меток Большое количество подключений. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |