Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2011, 00:16   #1
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию Прирост скорости работы ListView

Да да. Я снова начал древний сабж и глумление над TListView. Прочитал 100 компонентов делфи в какой-то там раз и в какой-то там раз убедился, что ничего нового о ListView я не узнал. Суть такая, написал програмку, которая должна искать файлы по категориям и загружать их соответственно в ListView, НО:
1. Количество итемов может превышает 50к;
2. С самого начала я выбрал нерациональный способ и загружал найденные строки в TStringList, а потом уже загружал в ListView и дорабатывал как мне надо (стринглист убивалсо около минуты при закрытии программы и беспощадно занимал ну очень много виртуальной памяти).

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

Виртуальный режим ListView не предлагать, уже пробовал осуществить, но он лагает ещё больше.

Как мне увеличить скорость ListView, мб строки пихать в файл, а потом уже считывать? Сказал быдлокодер вечно ищущий любую оптимизацию. Подскажите, пожалуйста, рациональный способ решения этой проблемы.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 13.02.2011, 00:46   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Виртуальный режим ListView не предлагать, уже пробовал осуществить, но он лагает ещё больше.

плохо пробовал. там нечему "лагать", хоть 50к записей, хоть 500 миллиардов.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 13.02.2011, 12:08   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но, увы, это тоже очень долго.
Да есть за ним такая бяка, потому рекомендуют заполнять его в границах
Код:
 With ListView.Items do begin
  BeginUpdate;
  ... Тут код наполнения
  EndUpdate;
 end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.02.2011, 12:57   #4
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да есть за ним такая бяка, потому рекомендуют заполнять его в границах
Код:
 With ListView.Items do begin
  BeginUpdate;
  ... Тут код наполнения
  EndUpdate;
 end;
BeginUpdate и EndUpdate использовал сразу же, но скорость загрузки всё равно маленькая, чтобы загрузить 60к итемов нужно ждать около 1 минуты (Да да, я псих, что загружаю столько итемов в листвьюв). Я бы хотел найти способ загружать итемы как минимум в 2 раза быстрее.

Ради интереса засёк сколько будет загружать 50к итемов, оказалось на 4 секунды больше, чем тогда когда я загружал 60к итемов)

Цитата:
Сообщение от veniside Посмотреть сообщение
> Виртуальный режим ListView не предлагать, уже пробовал осуществить, но он лагает ещё больше.

плохо пробовал. там нечему "лагать", хоть 50к записей, хоть 500 миллиардов.
Начинает лагать из-за того, что он используя нужные мне процедуры поиска файлов делает их постоянно из-за главного события виртуального режима onData. И эти лаги похуже, чем в обычном режиме.

Увеличил скорость добавления на 20 секунд, изменив сам способ добавления.

Было:
Код:
MainForm.LV_Clean.Items.Insert(0);       
 with MainForm.LV_Clean.Items.Item[0] do
   begin
   Caption:=AnsiLowerCase(SR.Name);
   SubItems.Add(FileSizeToNormalSize(SR.Size));
   SubItems.Add(T);                         
   end;
Стало:
Код:
MainForm.LV_Clean.Items.Insert(0);            
 with MainForm.LV_Clean.Items.Item[0] do
  begin
  Caption:=AnsiLowerCase(SR.Name);
  SubItems.Text:=FileSizeToNormalSize(SR.Size)+#13+T;
  end;
Возможно есть ещё способ оптимизировать скорость добавления, подкорректировав ещё способ добавления, я думаю, что можно как то это осуществить без Insert.
Возможно Я Быдлокодер ©.

Последний раз редактировалось Stilet; 13.02.2011 в 17:19.
t2skler вне форума Ответить с цитированием
Старый 13.02.2011, 15:21   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Возможно есть ещё способ оптимизировать скорость
Возможно. Использовать ListView только для отрисовки видимого.
А сами данные хранить и загружать в StringList
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.02.2011, 15:28   #6
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Возможно. Использовать ListView только для отрисовки видимого.
А сами данные хранить и загружать в StringList
StringList уже использовал, только вот про отрисовку видимых элементов не знаю, мб есть пример?

Хочу попробывать в виртуальном режиме используя данные из StringList отрисовывать только видимые итемы, как это можно сделать?
Возможно Я Быдлокодер ©.

Последний раз редактировалось Stilet; 13.02.2011 в 17:22.
t2skler вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перетащить элемент ListView в другой ListView? Paul Hindenburg Компоненты Delphi 5 26.01.2013 11:35
Уменьшение скорости работы скрипта amdbodia PHP 3 16.01.2011 20:49
Синхронизация работы Tthread и данных в ListView как реализовать? Человек_Борща Общие вопросы Delphi 4 20.12.2010 01:00
[C# + WPF] ListView. Узнать выделена ли строка в нём. ListView.View == GridView. Casper-SC WPF, UWP, WinRT, XAML 2 12.08.2010 19:04
С++ под Linux увеличение скорости работы с болванкой Yulka Помощь студентам 0 16.12.2009 21:42