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

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

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

Восстановить пароль
Повторная активизация e-mail

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

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

У меня на главной форме 5 компонентов ListBox. В каждый из них загружаются данные из txt-файлов объемом по 1 Мб. Способ загрузки обычный
listbox1.Items.LoadFromFile('file.t xt'); Дело в том, что процесс загрузки занимает около 12 секунд. Есть ли возможность ускорить этот процесс?
Dux вне форума Ответить с цитированием
Старый 29.10.2008, 01:11   #2
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Хм... я бы предложил сделать этот процесс через потоки.
по одному на каждый листбокс, приоритет главного процесса установить высокий, а для потоков выше среднего.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 29.10.2008, 01:16   #3
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Спасибо за наводку, Air, однако с потоками до этого не работал, может подбросите примерчик?
Dux вне форума Ответить с цитированием
Старый 29.10.2008, 01:22   #4
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Вот нашёл.
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8
http://www.programmersforum.ru/showt...EE%F2%EE%EA%E8

Каждая тема чем-то полезная.
В частности Вам нужен класс TThread

Создать поток (в delphi) можно так
File - new - other - theread object
вводите имя класса и готово.
Не забудьте в
Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2;
добавить имя модуля
и создать переменную этого типа для управления
Код:
var
  Form1: TForm1;
  Potok:TPotok;
создаём остановленным
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
Potok:=TPotok.Create(true);
Potok.Suspend; - остановка
Potok.Resume; - запуск
Potok.Priority:=... -  проритет (не выше главного процесса)
end;
Тип
TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest,
tpTimeCritical);
tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest, tpTimeCritical - в порядке увеличения

____
в архиве пример... должен быть, взял из ресурса delphi

___
Вот ещё примерчик, как изменить приоритет главного процесса
Важно!
что бы не было похожего имени процесса в системе.


Код:
Uses Tlhelp32;

Const
PC_IDLE = IDLE_PRIORITY_CLASS;
PC_IDLE_NORMAL = 16384;
PC_NORMAL = NORMAL_PRIORITY_CLASS;
PC_NORMAL_HIGH = 32768;
PC_HIGH = HIGH_PRIORITY_CLASS;
PC_REALTIME = REALTIME_PRIORITY_CLASS;

function GetProcessId(pName: PChar): dword;
var
 Snap: dword;
 Process: TPROCESSENTRY32;
begin
  Result := 0;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
      Process.dwSize := SizeOf(TPROCESSENTRY32);
      if Process32First(Snap, Process) then
         repeat
          if lstrcmpi(Process.szExeFile, pName) = 0 then
             begin
              Result := Process.th32ProcessID;
              CloseHandle(Snap);
              Exit;
             end;
         until not Process32Next(Snap, Process);
      Result := 0;
      CloseHandle(Snap);
     end;
end;

function SetPriority(ExeName:string; PRIORITY_CLASS:Cardinal):boolean;
var q:Cardinal;
begin
q:=openprocess(PROCESS_SET_INFORMATION,false,getprocessId(pchar(ExeName)));
result:=SetPriorityClass(q,PRIORITY_CLASS);
CloseHandle(q);
end;
Использование
procedure TForm1.FormCreate(Sender: TObject);
begin
SetPriority(extractfilename(paramstr(0)),PC_IDLE);
end;
paramstr(0) - указывает на ваш процесс.
Вложения
Тип файла: zip Threads.zip (3.6 Кб, 17 просмотров)
Всё гениальное - просто!

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

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

А насколько реально потоки увеличат производительность? Ведь если процессор уже занят на 100%, все равно в очередь пойдет.

Нужно помимо потоков еще и саму загрузку оптимизировать. LoadFromFile это не самый быстрый способ, тем более в визуальный компонент.
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, 16:37   #7
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

mutabor никто не говорил что проц загружен на 100%
И я же сказал что "я бы предложил сделать..." я не говорю что это единственный способ, просто форма не будет тормозить при загрузке листбоксов.
___
А может на время загрузки вообще св-во Visible в false перевести?
Ведь тогда прорисовывать строчки в листбоксе не придётся, а когда подгрузка завершится можно вернуть в true.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 29.10.2008, 17:29   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
mutabor никто не говорил что проц загружен на 100%
Он загружен. С чего бы еще 12 секунд ждать.

Цитата:
А может на время загрузки вообще св-во Visible в false перевести?
Ничего не даст.

Я пробовал как-то в Memo ускорить вывод, мне из StringList нужно было выводить на экран, так способ Text:=Text в два раза быстрее других. Попробовал в ListBox, с ним этот номер не проходит, то же время. На загрузку из файла 1МБ уходит не более 20мс, а на отображение 1500.

Цитата:
просто форма не будет тормозить при загрузке листбоксов
И то хорошо.

Dux, если не выйдет ускорить, сделай прогресс бар, короче окультурь это дело.
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 в 17:38.
mutabor вне форума Ответить с цитированием
Старый 29.10.2008, 18:49   #9
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Перепробовал уже все что можно, visible и так стоит в false у всех листобоксов, есть прогресс бар, использую Apllication.Processmessages, и beginupdate, endupdate и со всем этим загрузка около 12 сек. Это электронный словарь и количество слов постоянно пополняется, поэтому и ищу способ ускорить загрузку в listbox.
Dux вне форума Ответить с цитированием
Старый 29.10.2008, 20:56   #10
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Хм...
Электронный словарь.... Тогда не обойтись без загрузки БД, значит делаем форму и на ней располагаем прогрессбар,
св-ва BorderStyle:=bsNone
BorderIcons:=[] // т.е пустым (или параметры выставляем в false)
получим форму без кнопок управления. Написать "Загрузка БД, подождите..." (и прогрессбар будет отображать состояние готовности)
Как загрузка завершится, отобразить форму, а эту (с прогрессбаром), спрятать Form1.Hide (к примеру).
__
Во всяком случае сделаем видимость нормальной подгрузки, а не видимость подвисания программы.
всё же с потоками чуть лучше, потому что, если освободится ресурс CPU, то загрузка в любом случае пойдёт быстрее, конечно если CPU слабоват, да и ОЗУ маловато... (128-512), то ничего не поделаешь.
________
mutabor, а что если задействовать AssignFile и подгружать построчно?.. - в бесконечном цикле, без задержки типа Sleep(1).
Обычно загрузка CPU на 50%, за то КПД выше. Или TFileStream задействовать...
____
Dux в каком формате Ваша БД (те файлы что грузите в листбокс)?
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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