Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Oптимизировать загр. txt-файла в StringList и дальше в RichEdit


Страницы:   1 2

wah ©   (2009-09-08 21:10:00) 

При открытии файла мне нужно его обработать, потом положить в RichEdit. Я сначала гружу в StringList, потом построчно обрабатываю и кладу в RichEdit. Получается тормозно. RichEdit ждет пока все загрузится.
Посоветуйте, плз, как сделать. Хотя бы направление - через OnIdle, потоки, API  или еще как-нибудь.
С ув.


Sapersky   (2009-09-10 15:36:00) [1]

Не то чтобы абсолютное зло, просто борландовцы в своё время малость поленились и сделали добавление строк из TStringList-источника через вызов в цикле универсальной функции TRichEditStrings.Insert, хотя правильнее было бы написать специализированную функцию.
Как её писать - есть такое предположение, что можно использовать метод, аналогичный TRichEditStrings.LoadFromStream (SendMessage(RichEdit.Handle, EM_STREAMIN,...), но без промежуточного стрима. Преобразование текста в LoadFromStream делается собственной функцией, которая передаётся в SendMessage в виде callback, и вроде бы ничто не мешает написать аналогичную функцию, использующую в качестве входных данных TStringList вместо TStream.


Andy BitOff   (2009-09-10 10:45:00) [2]

Дык, что же это получается, братцы! РичЕдит это зло?


sniknik   (2009-09-10 09:38:00) [3]

очень странно...
вчера на работе не было тормозов, не мог понять о чем вообще речь, вечером дома перепроверил, тормоза есть, сегодня убедится перепроверяю еще раз на работе тормозов нет! ... разница, на работе комп P4 3000 c 1.5 гигами памяти, и "свежая" установка (буквально неделю назад "полетел" системный диск пришлось переставлять), дома amd 3200+ и 2 гига памяти и забыл уже когда винду устанавливал (вроде в 2004-5 году). и там и там система XP. вот.
p.s. через стрим работает быстро и там и там.
p.p.s. вот уж не думал, а у меня куча мест где делается просто присвоение richedit.lines.text:= stringslist.text, что тоже тормозит проверял, хорошо не много данных так обычно обрабатывается, много я обычно в рекорсетах держу, но даже так, "тормоз" в секунду там где его вообще не должно быть... нехорошо.


wah   (2009-09-10 04:54:00) [4]

> [30] MonoLife ©   (10.09.09 03:00)
> заюзать TWebBrowser?

У меня там типа редактора, поэтому наверное вряд ли.


MonoLife   (2009-09-10 03:00:00) [5]

>wah ©
Может, вместо RichEdit, как вариант, заюзать TWebBrowser? Я, в свое время, отказался от RE пытаясь решать подобную задачу..


wah   (2009-09-09 18:27:00) [6]

> [28] Sapersky   (09.09.09 17:38)

Большое спасибо. Попробую с TMemoryStream. Тему можно закрывать.
И вообще всем, конечно, спасибо.


Sapersky   (2009-09-09 17:38:00) [7]

> Use Debug DCUs
Я до этого еще не дочитал. Что это и где про это читать?


В настройках проекта на закладке Compiler. Позволяет трассировать стандартные модули (дельфийский VCL/RTL, внутрь виндовых функций так не залезть).
Cтавим breakpoint на нужной строке, когда до неё дойдёт - жмём F7 (Step into), F7, F7... при этом пытаемся разглядеть потенциально тормозные действия, в данном случае это (ИМХО) работа с контролом через SendMessage.
Можно, конечно, и вручную всё "размотать", но трассировкой проще/быстрее.

> тормозят, судя по всему, TRichEditStrings.Get Count и TRichEditStrings.Insert).
То есть сама компонента виновата?


Похоже на то.
Несколько более прямой вариант [17] - сохранять во временный TMemoryStream.


wah   (2009-09-09 17:25:00) [8]

> [25] Sapersky   (09.09.09 17:12)
> Use Debug DCUs

Я до этого еще не дочитал. Что это и где про это читать?

> тормозят, судя по всему, TRichEditStrings.Get Count и TRichEditStrings.Insert).

То есть сама компонента виновата?


wah   (2009-09-09 17:13:00) [9]

> [24] sniknik ©   (09.09.09 15:52)
> НОВЫЙ проект

Сделал все как велено. Та же фигня. Пробовал Memo, вместо RichEdit'a, пробовал на D7, вместо D10Lite, разные файлы - тормозит в зависимости от размера, 800 кб - 1,5 мин. Только с английским текстом - то же.
На файле 200 кб - 10 секунд.
Проект выложил сюда: http://wah.pp.ru/files/_RichEdit.rar
Вроде где-то видел инфу, что richedit.dll в Винде глючный. Может из-за этого? Но Memo тоже тормозит.


Sapersky   (2009-09-09 17:12:00) [10]

Автор, включай Use Debug DCUs и проходи отладчиком по "потрохам" REdit.Lines:=FullText.
(cобственно, я уже прошёл - тормозят, судя по всему, TRichEditStrings.GetCount и TRichEditStrings.Insert).


sniknik   (2009-09-09 15:52:00) [11]

чудес не бывает, что то у тебя тормозит, поэтому сделай НОВЫЙ проект в котором нет и следа от обработок/циклов и любого другого не относящегося к обсуждению кода...
только ричедит и кнопка с кодом

FullText := TStringList.Create;
FullText.LoadFromFile('вот тут тоже не переменную а реальный путь, а то гадай тут, может у тебя файл в инете');
REdit.Lines.Assign(FullText);

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


wah   (2009-09-09 11:47:00) [12]

> [22] Anatoly Podgoretsky ©   (09.09.09 11:21)
> Если нет никакой обработка, то зачем же грузить в StringList

Сейчас нет, потом будет.


Anatoly Podgoretsky   (2009-09-09 11:21:00) [13]

> wah  (09.09.2009 11:11:20)  [20]

Если нет никакой обработка, то зачем же грузить в StringList


wah   (2009-09-09 11:12:00) [14]

> [18] MBo ©   (09.09.09 06:56)
> а  REdit.Lines.Assign(FullText) ?

Абсолютно то же самое.


wah   (2009-09-09 11:11:00) [15]

> [19] AIK ©   (09.09.09 07:52)
> Покажи что за "обработка содержимого StringList"

Dear аксакалы, нет никакой обработки! Просто берем txt-файл в 150 кил, кладем его в StringList, потом из StringList'a кладем в RichEdit. И эта последняя операция занимает около 8 секунд:
FullText := TStringList.Create;
FullText.LoadFromFile(FileName);
REdit.Lines:=FullText;
Комп, естественно, не четверка и не 1-й пень. Попробуйте сами.


AIK   (2009-09-09 07:52:00) [16]

>  for i := 0 to FullText.Count - 1 do
>  begin
>    // обработка содержимого StringList
>  end;

Покажи что за "обработка содержимого StringList"


MBo   (2009-09-09 06:56:00) [17]

а  REdit.Lines.Assign(FullText) ?


wah   (2009-09-09 04:55:00) [18]

> [16] MonoLife ©   (09.09.09 04:30)
> а может как раз при чтении xml тормоза и REdit ни причем?

Да нет, я его как текст читаю, без всякой обработки. Можете попробовать сами:
FullText := TStringList.Create;
FullText.LoadFromFile(FileName);
REdit.Lines:=FullText;

У меня опыта практически нет, но тормоза эти кажутся странными. Файл всего 150 кб.
Пока решил проблему так:
procedure TMainForm.Button1Click(Sender: TObject);
var
 FullText: TStringList;
 i: Integer;
begin
 FullText := TStringList.Create;
 FullText.LoadFromFile(FileName);
 for i := 0 to FullText.Count - 1 do
 begin
   // обработка содержимого StringList
 end;
 FullText.SaveToFile(tmpFile);
 FullText.Free;
 REdit.Lines.LoadFromFile(tmpFile);
end;

Грузится в долю секунды. Но все равно хочется сделать прямее.


MonoLife   (2009-09-09 04:30:00) [19]

>  Для этого я решил использовать формат xml. Хотя можно использовать
> и другой формат, просто нужно обозначить абзацы, которые
> должны выглядеть в RichEdit'e по разному.

а может как раз при чтении xml тормоза и REdit ни причем?


wah   (2009-09-09 03:13:00) [20]

> [14] Германн ©   (09.09.09 02:57)
> "плайн-текст с некоторым форматированием".

плайн-текст отобразить с некоторым форматированием


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо