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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2008, 22:07   #11
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Загрузка как таковая происходит за пару милисекунд, неважно как это делать. Время уходит на добавление строк в визуальный компонент, т.е. если сделать загрузку в TStringList она пройдет в мгновение ока, а вот уже ListBox1.Items:=StringList; процесс длительный (как именно переносить строки, не имеет значения, время то же), по длительности равнозначный простому ListBox1.Items.LoadFromFile, отсюда можно сделать вывод что ускорять нужно не загрузку а отображение, т.е. TFileStream тут ничем не поможет. Если построчно в цикле добавлять в ListBox строки, будет еще дольше.

У меня добавление строк в ListBox грузит проц по полной программе, на 100%.

Это наверное двухъядерный на 50% грузит, одно ядро.

Dux, можно немного схитрить. Сразу загрузить только видимую часть с небольшим запасом, допустим в видимую часть списка в данный момент поместится 50 строк, загрузить туда 200. И так с каждым. Будет быстро. И пользователю ждать не нужно будет. А остальное подгрузить постепенно в фоне, будет эффект открытия большой таблицы в браузере с не очень быстрым подключением, верх доступен а низ еще грузится.

Цитата:
visible и так стоит в false у всех листобоксов
постойте, постойте, она постоянно в false? они что не нужны на экране?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 29.10.2008 в 22:26.
mutabor вне форума Ответить с цитированием
Старый 29.10.2008, 22:18   #12
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Вы как-то сказали что метод Text:=Text; сработал быстрее, может попробовать
Код:
StringList.LoadFromFile;
ListBox1.Items.Text:=StringList.Text;
________
Цитата:
Сообщение от mutabor
автору нужны списки в памяти а не на экране
Возможно, когда я только начинал программировать, то не знал как использовать списки, то использовал листбокс (visible:=false)
Всё гениальное - просто!

Последний раз редактировалось Air; 29.10.2008 в 22:37.
Air вне форума Ответить с цитированием
Старый 29.10.2008, 22:32   #13
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

У меня появилась гипотеза что автору нужны списки в памяти а не на экране. Тогда проблема отпадает. Ждем пояснений.

Цитата:
Вы как-то сказали что метод Text:=Text; сработал быстрее, может попробовать
Он почему-то быстрее работает только в Мемо. В два раза быстрее, проверено.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 29.10.2008, 22:55   #14
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Хм...
Электронный словарь.... Тогда не обойтись без загрузки БД, значит делаем форму и на ней располагаем прогрессбар,
св-ва BorderStyle:=bsNone
BorderIcons:=[] // т.е пустым (или параметры выставляем в false)
получим форму без кнопок управления. Написать "Загрузка БД, подождите..." (и прогрессбар будет отображать состояние готовности)
Как загрузка завершится, отобразить форму, а эту (с прогрессбаром), спрятать Form1.Hide (к примеру).
__
Во всяком случае сделаем видимость нормальной подгрузки, а не видимость подвисания программы.
всё же с потоками чуть лучше, потому что, если освободится ресурс CPU, то загрузка в любом случае пойдёт быстрее, конечно если CPU слабоват, да и ОЗУ маловато... (128-512), то ничего не поделаешь.
____
Dux в каком формате Ваша БД (те файлы что грузите в листбокс)?
Описанное Вами выше уже сделано. Видимость нормальной загрузки присутствует. Вопрос только во времени. Формат - обычный txt-файл, каждая строчка - это слово или сочетание. По поводу озу - вряд-ли, у меня 4 ГБ оперативки.
Dux вне форума Ответить с цитированием
Старый 29.10.2008, 22:58   #15
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Dux что по поводу 11 и 13 постов?
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 29.10.2008, 23:00   #16
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение

Dux, можно немного схитрить. Сразу загрузить только видимую часть с небольшим запасом, допустим в видимую часть списка в данный момент поместится 50 строк, загрузить туда 200. И так с каждым. Будет быстро. И пользователю ждать не нужно будет. А остальное подгрузить постепенно в фоне, будет эффект открытия большой таблицы в браузере с не очень быстрым подключением, верх доступен а низ еще грузится.


постойте, постойте, она постоянно в false? они что не нужны на экране?
Так не выходит, если форма активна, то в OnChange компонента Edit производится поиск по листбоксу, а если он будет загружен не весь, случится конфуз... false стоит только при загрузке, когда списки загружены - конечно true

Как выглядит программа визуально, можете посмотреть здесь http://www.marinedictionary.ru/dictionary.htm
Сейчас работаю над новой версией

Последний раз редактировалось Dux; 29.10.2008 в 23:03.
Dux вне форума Ответить с цитированием
Старый 29.10.2008, 23:09   #17
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Ведь поиск производится не моментально после запуска проги и даже не спустя 10 сек., можно подгружать списки в фоне, по возможностям CPU.
А пока грузится, отвлечь пользователя инфой о возможностях проги. (это так к примеру)
Что я придумал!
Вы же ищите в листбоксе?
А почему бы не искать в StringList?
туда загрузка производится быстрее, а результаты помешать в листбокс?
__
P.S. всмысле БД хранить в StringList а по мере необходимости загружать в листбокс
__
Цитата:
Операционная система: Microsoft® Windows® Vista/XP/2000, Windows 98SE/ME
Боюсь что на , Windows 2000 98SE/ME, прога вообще будет 2 часа грузиться (не в обиду)
Всё гениальное - просто!

Последний раз редактировалось Air; 29.10.2008 в 23:14.
Air вне форума Ответить с цитированием
Старый 29.10.2008, 23:21   #18
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Ведь поиск производится не моментально после запуска проги и даже не спустя 10 сек., можно подгружать списки в фоне, по возможностям CPU.
А пока грузится, отвлечь пользователя инфой о возможностях проги. (это так к примеру)
Что я придумал!
Вы же ищите в листбоксе?
А почему бы не искать в StringList?
туда загрузка производится быстрее, а результаты помешать в листбокс?
__
P.S. всмысле БД хранить в StringList а по мере необходимости загружать в листбокс
__

Боюсь что на , Windows 2000 98SE/ME, прога вообще будет 2 часа грузиться (не в обиду)
Эх.. код программы сложный и запутанный, делать кардинальные изменения нет сил и желания.. если нет возможности ускорить загрузку в листбокс, черт с ним, 12 секунд не такая уж и проблемма. С StringList до этого не работал, так что и не знаю, стоит ли затеваться..
Dux вне форума Ответить с цитированием
Старый 29.10.2008, 23:29   #19
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

почему бы и нет.
Работа проще некуда
Код:
var List:TStringList; i:integer;
begin
List:=TStringList.Create;
list.Add('1');
list.Add('2');
list.Delete(1);
list.Find('2',i);
list.Sort;
end;
это тот же класс что и листбокс, только нет визуализации.
По экспериментируйте для начала в отдельной проге, на предмет загрузки списков из StringList в листбокс по необходимости, если результат удовлетворит, то можно и попыхтеть со справочником.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 29.10.2008, 23:44   #20
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Попробовал такой вариант, однако результат тот же - 12 сек

Код:
procedure TForm1.FormCreate(Sender: TObject);
var List, List2,List3,list4,list5:TStringList; 
begin
List:=TStringList.Create;
List2:=TStringList.Create;
List3:=TStringList.Create;
List4:=TStringList.Create;
List5:=TStringList.Create;

list.loadfromFile('dc001.md');
list2.loadfromFile('dc002.md');
list3.loadfromFile('dc003.md');
list4.loadfromFile('dc004.md');
list5.loadfromFile('dc005.md');

list.Sort;

listbox1.items:=list;
listbox2.items:=list2;
listbox3.items:=list3;
listbox4.items:=list4;
listbox5.items:=list5;
end;
Dux вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не открывает из списка файлов ListBox SANTA_KLAUD Общие вопросы Delphi 8 27.05.2008 20:30
Как ускорить загрузку битмапа в tImage Altera Мультимедиа в Delphi 10 24.03.2008 17:39
Как прочесть txt файл www.site.ru/info.txt BR17UY Работа с сетью в Delphi 1 16.04.2007 13:01
как считать данные с Txt файла? Alar Общие вопросы Delphi 0 29.10.2006 20:12