![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Oптимизировать загр. txt-файла в StringList и дальше в RichEdit
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)
> "плайн-текст с некоторым форматированием".
плайн-текст отобразить с некоторым форматированием