Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.10.2008, 00:40
Аватар для Dux
Dux Dux вне форума
Активный
 
Регистрация: 18.03.2008
Сообщения: 206
Репутация: 16
По умолчанию Как ускорить загрузку списка ListBox из txt-файла?

У меня на главной форме 5 компонентов ListBox. В каждый из них загружаются данные из txt-файлов объемом по 1 Мб. Способ загрузки обычный
listbox1.Items.LoadFromFile('file.txt'); Дело в том, что процесс загрузки занимает около 12 секунд. Есть ли возможность ускорить этот процесс?
Ответить с цитированием
  #2  
Старый 29.10.2008, 05:04
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Что-то долго 12 секунд на 5 мегабайт, проблема видимо не в загрузке.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 29.10.2008, 12:30
xchrom xchrom вне форума
Начинающий
 
Регистрация: 08.04.2008
Сообщения: 177
Репутация: 15
По умолчанию

есть идея перед загрузкой вызывать lisbox1.items.BeginUpdate, а после естественно lisbox1.items.EndUpdate... быстрее намного получаеться при построчном щаполнении, может и тебе подойдет...
__________________
правильный вопрос содержит в себе 90% ответа
Ответить с цитированием
  #4  
Старый 29.10.2008, 14:53
Аватар для Dux
Dux Dux вне форума
Активный
 
Регистрация: 18.03.2008
Сообщения: 206
Репутация: 16
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Что-то долго 12 секунд на 5 мегабайт, проблема видимо не в загрузке.

Да нет, именно в ней. попробуйте загрузить в листбокс текстовый файл с 50000 строк и посмотрите сколько времени на это уйдет..
Ответить с цитированием
  #5  
Старый 29.10.2008, 14:54
Аватар для Dux
Dux Dux вне форума
Активный
 
Регистрация: 18.03.2008
Сообщения: 206
Репутация: 16
По умолчанию

Цитата:
Сообщение от xchrom
есть идея перед загрузкой вызывать lisbox1.items.BeginUpdate, а после естественно lisbox1.items.EndUpdate... быстрее намного получаеться при построчном щаполнении, может и тебе подойдет...

Это я уже использую, но заметно не ускоряет, может на 1 сек
Ответить с цитированием
  #6  
Старый 29.10.2008, 17:27
Аватар для mak-karpov
mak-karpov mak-karpov вне форума
Активный
 
Регистрация: 18.09.2008
Сообщения: 235
Версия Delphi: 2010 и 7
Репутация: 1242
По умолчанию

А че ты туда насовал
__________________
Кнопка "+" - весы в правом верхнем углу сообщения...
Ответить с цитированием
  #7  
Старый 29.10.2008, 18:41
Аватар для Dux
Dux Dux вне форума
Активный
 
Регистрация: 18.03.2008
Сообщения: 206
Репутация: 16
По умолчанию

Цитата:
Сообщение от mak-karpov
А че ты туда насовал

это электронный словарь
Ответить с цитированием
  #8  
Старый 29.10.2008, 18:56
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Уважаемый, Dux, если вы внимательно посмотрите в исходниках как происходит загрузка строк из текстового файла в ListBox, то будете неприятно удивлены.
Каждая строка добавляется через метод Add в цикле. А что такое циклы в Delphi очень даже известно.
Никаким способом (ну, может быть, кроме приобретения суперкомпа ) ускорить загрузку 50000 строк не получится. Судя по вашим 12-ти секундам у вас еще очень шустрый компьютер.
Так же, не очень понятно как бедный пользователь будет справлятся с 50-тью тысячими строк в ListBox'е (если, конечно, эти мегабайты предназначены для ручной манипуляции с ними).
Дать рекомендации по вашей задаче возможно, только тогда, когда станет ясна задача для чего необходимо держать в памяти 5 Мб информации. А может быть, так нагружать память и не требуется?
В любом случае, если очень хочется загрузить такое количество информации придется применять изощренные методы. Например, использовать Thread'ы. Предположительно, несколько должно помочь.
Хотя я бы держал эти мегабайты в базе. Выборка нужных строк в SQL базах происходит очень быстро.
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #9  
Старый 29.10.2008, 19:18
Аватар для Dux
Dux Dux вне форума
Активный
 
Регистрация: 18.03.2008
Сообщения: 206
Репутация: 16
По умолчанию

Переделывать уже поздно.. приходиться пользоваться listbox. Поиск происходит в режиме online, поэтому приходится все держать в памяти.
Ответить с цитированием
  #10  
Старый 29.10.2008, 19:23
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Попробуйте применить Thread'ы при загрузке. На каждый ListBox своя "нить". Или тоже поздно? Тогда, облом.
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #11  
Старый 29.10.2008, 21:26
Izhic Izhic вне форума
Прохожий
 
Регистрация: 21.10.2008
Сообщения: 11
Репутация: 10
Радость

Цитата:
Сообщение от san-46
Попробуйте применить Thread'ы при загрузке. На каждый ListBox своя "нить". Или тоже поздно? Тогда, облом.

ВСё просто Application.ProcessMessages в цикле пиши и будет счастье на твой дом.
Это при строчной загрузке.
__________________
Улёттттттттттттт!!!!
Ответить с цитированием
  #12  
Старый 29.10.2008, 21:55
Alexo Alexo вне форума
Начинающий
 
Регистрация: 24.01.2007
Сообщения: 191
Репутация: 15
По умолчанию

А если попробовать сначало загрузить данные в поток, а потом в листбооксе из потока загрузку сделать?
__________________
Delphi - это лишь инструмент, а что ты сможешь создать при помощи этого инструмента, зависит исключительно от тебя.
Ответить с цитированием
  #13  
Старый 29.10.2008, 22:12
Izhic Izhic вне форума
Прохожий
 
Регистрация: 21.10.2008
Сообщения: 11
Репутация: 10
По умолчанию

LoadFromFile в целом и так поток. Если частями, то с тем что я сказал соединить и попробовать
__________________
Улёттттттттттттт!!!!
Ответить с цитированием
  #14  
Старый 29.10.2008, 22:33
Alexo Alexo вне форума
Начинающий
 
Регистрация: 24.01.2007
Сообщения: 191
Репутация: 15
По умолчанию

Application.ProcessMessages

Вобще тормозит цикл
__________________
Delphi - это лишь инструмент, а что ты сможешь создать при помощи этого инструмента, зависит исключительно от тебя.
Ответить с цитированием
  #15  
Старый 29.10.2008, 23:15
Izhic Izhic вне форума
Прохожий
 
Регистрация: 21.10.2008
Сообщения: 11
Репутация: 10
По умолчанию

Правильно зато разрешает работать с окном.
А нам это и надо. К тому же тормоза пооОчти не заметны
__________________
Улёттттттттттттт!!!!
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:38.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter