Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
1

ListCtrl большое количество InsertItem

04.12.2019, 19:48. Показов 2461. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет ребята. Может кто нибудь подскажет или хотя бы приблизительное знает как с таким можно бороться.
Я в программе разбиваю файл на определенные строчки. Строчек получается много.
Потом в цикле для каждой строчки делаю InsertItem. Пока файлы килобайтные, все прекрасно. Но если фал несколько мегабайт,
то процедура вставки итемов начинает занимать неприлично много времени. Такой программой пользоваться становиться очень неудобно и раздражительно.
Причем я поубирал все функции, большее количество времени уходит именно на цикл вставки итемов. Как с этим справиться?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2019, 19:48
Ответы с готовыми решениями:

Количество дней, когда выпало самое большое количество осадков
В массиве хранится информация о количестве осадков,выпавших за каждый день октября. определить...

Интересное поведение CListCtrl::InsertItem()
Приветствую! решиль в свое CListCtrl реализовать Drag-and-Drop. Всё получилось хорошо, в плане...

QListWidget insertItem вставка строки в нужное место
Вопрос на засыпку: Почему метод insertItems вставляет на нулевую строку без проблем QStringList...

большое количество точек
Здравствуйте, как возможно оптимизированно хранить где либо и прорисовывать соответственно на...

35
131 / 116 / 25
Регистрация: 03.05.2017
Сообщений: 336
Записей в блоге: 1
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
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а при чём тут размер файлов?
Чем больше файл тем большее количество InsertItem в цикле
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
Цитата Сообщение от Алексей1153 Посмотреть сообщение
нужно отображать только ту часть, которая видна на экране
МММ а как такое можно провернуть?
0
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
04.12.2019, 20:24 9
не нужны там никакие InsertItem. Стандартный контрол не предназначен для просмотра больших списков

Добавлено через 1 минуту
Цитата Сообщение от zombivadim Посмотреть сообщение
МММ а как такое можно провернуть
сделай в контроле столько строк, сколько помещается на экране. А вот содержимое будет зависеть от полосы прокрутки - как бы такое окно-рамочка по длинному списку едет и отображает только то, что в рамочку попало
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
Цитата Сообщение от Алексей1153 Посмотреть сообщение
MFC
А может есть более подходящий контрол для такой задачи?
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 секунд
Цитата Сообщение от zombivadim Посмотреть сообщение
MFC ShellList Control , MFC ShellTree Control
видимо, список и дерево )
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
04.12.2019, 20:59  [ТС] 16
Цитата Сообщение от Алексей1153 Посмотреть сообщение
видимо, список и дерево )
Не я думал может из этих элементов MFC.. есть что то подходящие)
А почему стандартный ползунок не подойдет, от него нет уведомлений о прокрутке?
0
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
04.12.2019, 21:05 17
Цитата Сообщение от zombivadim Посмотреть сообщение
А почему стандартный ползунок не подойдет
если в списке будет всего 15 строк, то ползунок так же будет лишь на 15 позиций
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
04.12.2019, 21:19  [ТС] 18
Цитата Сообщение от Алексей1153 Посмотреть сообщение
будет лишь на 15 позиций
Дошло. Вы знаете вначале у меня была такая мысль, а может возможно заранее создать контрол в котором уже несколько тысяч строк. И использовать его уже как шаблон. Но судя по всему такое невозможно.
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 как решение

Решение

Цитата Сообщение от zombivadim Посмотреть сообщение
Привет ребята. Может кто нибудь подскажет или хотя бы приблизительное знает как с таким можно бороться.
Я в программе разбиваю файл на определенные строчки. Строчек получается много.
Здесь тебе надо воспользоваться вот такой штукой - Creating a Virtual List-View Control, LVS_OWNERDATA.
Пробежаться по файлу и начитать в массив смещение и размер строк, это займёт относительно немного памяти. По сообщениям LVN_ODCACHEHINT начитывать эти строки их файла.
1
04.12.2019, 22:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2019, 22:47
Помогаю со студенческими работами здесь

Большое количество строк
Добрый день, столкнулся с задачей где нужно обработать большое количество cтрочек, в каждой из...

Большое количество команд
Всем доброго времени суток. Сразу к делу) Нужно внести в таблицу (БД, Oracle) 6000+ строк. Как...

Большое количество меток
Добрый вечер! Во многих местах я встречал, что меток должно быть 30-50, чем чревато превышение...

Большое количество подключений.
Добрый день уважаемые форумчане. Столкнулся с такой бедой. При запуске браузера (Хром 16.0.912.63)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru