Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];




Вниз

Тормоза в ListView 


ghost_by   (2002-03-22 21:08) [0]

ListView тормозит при добавлении/удалении большого (<100) количества строк... Добавление/удаление выполняется достаточночасто и тормоза раздражают. Как от этого избавиться? Или может я чего неправильно делаю?



kull   (2002-03-23 01:23) [1]

попробуй


ListView.BeginUpdate;

//заполнение

ListView.EndUpdate;


а лучше так:


ListView.BeginUpdate;
try
//заполнение
finally
ListView.EndUpdate;
end;




kull   (2002-03-23 01:26) [2]

немного промахнулся, вот:


ListView.Items.BeginUpdate;
try
//заполнение
finally
ListView.Items.EndUpdate;
end;



ghost_by   (2002-03-24 21:20) [3]

OK!



cypher   (2002-03-24 22:11) [4]

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



Fay   (2002-03-25 13:16) [5]

2cypher
>врядли поможет
Проверь



ghost_by   (2002-03-27 07:46) [6]

Приблизительно следующего плана задача: Есть TreeView, и есть ListView. При смене узла в TreeView - изменяется содержимое ListView. Без BeginUpdate и EndUpdate на более тормозных корытах видно как удаляются и добавляются строки. Создается впечатление, что ListView обновляется после изменения, удаления или добавления.

После добавления BeginUpdate и EndUpdate время на удаление и добавление затрачивается такое же,но теперь нет никаких миганий.

Все равно тормозит! Что делать?



Arhelon   (2002-03-27 08:05) [7]

Проверь есть ли какие события у lv на разного рода Change
События OnChange и OnChanging (точность написания не гарантирую)
Вызываются по поводу и бес повода и ежли там что-то есть то соответственно обработчики выполняются. Это и торомозит процес обновления. Если оно есть то ставь там проверку на процес обновления.
lv и tv работают быстро ежли грамотно написаны по крайней мере порядка 1000 итемсов просто летает.



Alx2   (2002-03-27 08:09) [8]

Сейчас Random намусорил в ListView 100 itemов по 10 раз (очистка - снова заполнение) - пролетело ветром :).
Видимо, надо копать в коде. Кстати, можно на него взглянуть?



y-soft   (2002-03-27 08:32) [9]

Почитайте о виртуальном режиме работы с ListView в MSDN
При больших объемах очень помогает



Eug201   (2002-03-27 08:54) [10]

Я уже давно отказался от стандартного ListView и очень доволен: http://www.lischke-online.de/ отличные бесплатные компоненты. А скорость VirtualTreeView действительно неплохая.



ghost_by   (2002-03-27 21:46) [11]

На http://www.lischke- online.de/ только TreeView, ListView я не нашел, или он вместе с TreeView в одном архиве.

Насчет виртуального режима ListView - подозреваю, что придется писать свой компанент.

Насчет Сейчас Random намусорил в ListView 100 itemов по 10 раз кагда добавляются новые строки - согласен, но когда очищается весь ListView - тормозит. Попробуй чуть больше itemов - 200 скажем. В принципе - если корыто боле-менее быстрое - тормозов не заметно, но если корыто 200Mhz или что-то около того - ТОРМОЗ.



Malder   (2002-03-27 21:54) [12]

очищается весь ListView это в смысле listview1.clear ? Так это вообще моментально.
А насчет скорости - помню на 250-300 Мгц лимит listview (около 32000 записей) заполнялся за 5 секунд...



ghost_by   (2002-03-27 22:03) [13]

В смысле ListView1.Items.Clear;
5 секунд? Попробуй сделай пример и заполни ListView около 1000 Itemов на 250-300 Мгц, а потом удали их (очисли ListView) и ты поймешь как ты ошибался.

Создается впечатление, что в VCL плохая реализация ListView, так как на днях смотрел пример с ListView на Visual C++ (MFC) - абсолютно никаких тормозов.



RageSV   (2002-03-27 22:13) [14]


> Насчет виртуального режима ListView - подозреваю, что придется
> писать свой компанент.

В данном случае, не надо изобретать колесо. Оно уже изобретено.
Смотрите события:
OnData
OnDataFind
OnDataHint (если конечно надо)
OnDataStateChange

Далее. Методы BeginUpdate, EndUpdate - обязательны.

Удалять приаттаченые к итемам об`екты только через событие OnDeletion. И ни как через рекурсию при разрушении ListView/TreeView (см. исходники и все станет понятно).

Работает при добавлении 1000 записей в момент на очень слабых машинах. Если добавляются записи из СУБД - это другая песня. В противном случае, нужно смотреть твой код.



RageSV   (2002-03-27 22:16) [15]


> Создается впечатление, что в VCL плохая реализация ListView,
> так как на днях смотрел пример с ListView на Visual C++
> (MFC) - абсолютно никаких тормозов.

Ню-ню.
А может руки плохо реализованы ?



Eug201   (2002-03-28 06:46) [16]

Из VirtualTreeView очень легко сделать ListView.



Eug201   (2002-03-28 06:52) [17]

Поразбирайся с VirtualTreeView - действительно стоящая вещь - если что пиши на eug201_собака_mail.ru



ghost_by   (2002-03-28 13:52) [18]

А может руки плохо реализованы ? - а ты не смотрел? Там изначально - виртуальный ListView.

Из VirtualTreeView очень легко сделать ListView. - посмотрю.



ghost_by   (2002-03-28 21:39) [19]

В данном случае, не надо изобретать колесо. Оно уже изобретено.
Смотрите события:
OnData
OnDataFind
OnDataHint (если конечно надо)
OnDataStateChange


Спасибо - разобрался, скорость между прочим ни в какое сравнение не идет по сравнению с предыдущим результатом.



RageSV   (2002-03-28 22:33) [20]


> Спасибо - разобрался, скорость между прочим ни в какое сравнение
> не идет по сравнению с предыдущим результатом.

В какую сторону сравнение? Лучше, хуже?



RageSV   (2002-03-28 22:50) [21]


> ghost_by ©

Вспомнил. Вроде с Delphi есть пример использования ListView с виртуальной подкачкой. Попробуй запустить этот пример на большом массиве данных.
И все же, это зависит от задачи (блока, где ты эти данные подгружаешь). Возможно, у тебя не оптимизирован именно этот блок.
Как я раньше говорил, для больших объемом данных в СУБД, ListView/TreeView не лучший вариант (ни в VCL, ни в MFC, (и даже ни VirtualTreeView)). В данном случае, как правило, приходится их затачивать под конкретную задачу.
Например, цикл

while not что-то.EOF do
begin
записать в ListView/TreView
что-то.Next()
end

на больших объемах данных не прокатит.



ghost_by   (2002-03-29 07:26) [22]

В какую сторону сравнение? Лучше, хуже? - на порядок быстрее. Добился того, что мне нужно было.

Как я раньше говорил, для больших объемом данных в СУБД, ListView/TreeView не лучший вариант - я не с СУБД работаю. Все данные находятся в файле и достаточно быстро считываются. Я проверял - загрузка данных не являлась тормозом.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.03 c
6-32925           Arlekin               2002-01-24 17:56  2002.04.11  
Ну не хочет Он работать!!!!!


3-32673           grabovsky             2002-03-20 16:32  2002.04.11  
сохранение данных в StringGrid


4-33014           Evgeny                2002-02-09 08:41  2002.04.11  
Wizard


1-32756           Евгений-Зеленоград    2002-03-29 21:44  2002.04.11  
Математические действия с датой (TdateTime)


1-32775           Andron                2002-03-31 13:49  2002.04.11  
Как присвоить канву TChart а канве TBitmap a ?