Jochen Arndt
Кто будет читать (и прокручивать) 280 000 пунктов?
Решением будет использование виртуального элемента управления списком, который обрабатывает только те элементы, которые действительно видны. Видеть Элементы Управления Виртуальными Списками | Microsoft Docs[^].
Для невиртуального элемента управления списком вы можете (и всегда должны даже с меньшими списками) отключить обновление экрана при изменении списка:
pTable->SetRedraw(FALSE);
// Modify list here
pTable->SetRedraw(TRUE);
// Invalidate the entire list
pTable->Invalidate();
// Force painting
pTable->UpdateWindow();
[РЕДАКТИРОВАТЬ]
Зная заранее количество предметов, используйте
SetItemCount()
первоначально. Даже если вы не знаете счет заранее, это может быть, наконец, быстрее, чтобы определить и установить его.
Для дальнейших улучшений сделайте код внутри цикла как можно более быстрым (простым). Это включает в себя избегание любой функции, которая выделяет память в цикле. Используйте, например, предварительно
CString
s или буферы обычного текста, определенные вне цикла с помощью параметра max. возможная длина строки. Если это возможно, избегайте также любой функции форматирования строк.
[/РЕДАКТИРОВАТЬ]
Jochen Arndt
Память не заботится, пока нет подкачки. Какая разница, кто читает такие большие списки.
Отключение перерисовки значительно ускорит процесс. Если этого недостаточно, вы должны использовать виртуальный список или меньшие списки.
KarstenK
Виртуальный элемент управления списком является правильным решением и загружает только те данные, которые необходимо отобразить. Загрузка всех данных означает загрузку большого количества вещей, которые не отображаются на экране и замедляют работу вашего приложения.
Всегда помните: listcontrol создан не для массивных данных, а для небольшого снимка для пользователя.
saide_a
Большое спасибо ,я использовал виртуальный список, как описано в этой ссылке https://www.codeproject.com/Articles/7891/Using-virtual-lists