Форум: "Начинающим";
Текущий архив: 2009.11.01;
Скачать: [xml.tar.bz2];
ВнизOптимизировать загр. txt-файла в StringList и дальше в RichEdit Найти похожие ветки
← →
wah © (2009-09-08 21:10) [0]При открытии файла мне нужно его обработать, потом положить в RichEdit. Я сначала гружу в StringList, потом построчно обрабатываю и кладу в RichEdit. Получается тормозно. RichEdit ждет пока все загрузится.
Посоветуйте, плз, как сделать. Хотя бы направление - через OnIdle, потоки, API или еще как-нибудь.
С ув.
← →
СовестьДМ © (2009-09-08 21:12) [1]
> и кладу в RichEdit
каким образом?
← →
wah © (2009-09-08 21:20) [2]
FullText := TStringList.Create;
REdit.Lines.LoadFromFile(FileName);
for i := 0 to FullText.Count - 1 do
begin
// обработка
REdit.Lines.Add(FullText.Strings[i]);
end;
← →
СовестьДМ © (2009-09-08 21:28) [3]
FullText := TStringList.Create;
FullText.LoadFromFile(FileName);
for i := 0 to FullText.Count - 1 do
begin
// обработка
end;
REdit.Lines:=FullText;
← →
wah © (2009-09-08 21:50) [4]Тормозит как раз RichEdit - Пока все не загрузится, он не отвечает. Это секунд 8. Файл 150 кб.
← →
wah © (2009-09-08 22:10) [5]Наверно нужно два потока, в первом показать в RichEdit"e часть текста, а во втором (с меньшим приоритетом) подгружать остальные строки.
← →
Юрий Зотов © (2009-09-09 00:22) [6]> wah © (08.09.09 21:50) [4]
> Тормозит как раз RichEdit - Пока все не загрузится, он не отвечает.
> Это секунд 8. Файл 150 кб.
150 К - это не большой файл. Если он грузится аж целых 8 секунд, то тормозит не RichEdit, а построчная обработка (та, что в цикле). А RichEdit (да и вся программа) не отвечает потому, что все эти 8 секунд поток занят и не выбирает сообщения из очереди. Попробуйте, например, в течение этих 8 секунд "повозить" по форме окном любой другой программы. Если форма не будет перерисовываться, то так оно и есть.
Значит, и оптимизировать надо обработку строк. Но не видя ее кода, посоветовать ничего нельзя.
← →
Германн © (2009-09-09 00:54) [7]
> Но не видя ее кода, посоветовать ничего нельзя.
Ну кое-что можно посоветовать, ибо автор возражает не столько против "медленности", сколько против
> Пока все не загрузится, он не отвечает
.
Можно в цикл включить "выборку сообщений":for i := 0 to FullText.Count - 1 do
begin
// обработка
REdit.Lines.Add(FullText.Strings[i]);
Application.ProcessMessages;
end;
← →
wah © (2009-09-09 01:03) [8]> [6] Юрий Зотов © (09.09.09 00:22)
> Если форма не будет перерисовываться, то так оно и есть.
Вы правы, форма мажется. Но дело в том, что это происходит даже без всякой обработки строк:FullText := TStringList.Create;
FullText.LoadFromFile(FileName);
REdit.Lines := FullText;
Я даже попробовал записать из TStringList"а во временный файл а потом загрузить в RichEdit - получилось нормально, быстро. Почему же из TStringList"а в RichEdit тормозит?
← →
wah © (2009-09-09 01:16) [9][7] Германн © (09.09.09 00:54)
> не столько против "медленности"
Нет, конечно мне и тормоза не нравятся.
> Можно в цикл включить "выборку сообщений":
Так лучше, спасибо. Почти все нормально. Только при щелчке в окне РичЭдита до окончания загрузки, он начинает в цикле прокручивать текст.
← →
Германн © (2009-09-09 01:23) [10]
> wah © (09.09.09 01:16) [9]
>
> [7] Германн © (09.09.09 00:54)
> > не столько против "медленности"
>
> Нет, конечно мне и тормоза не нравятся.
Значит
> и оптимизировать надо обработку строк. Но не видя ее кода,
> посоветовать ничего нельзя.
← →
wah © (2009-09-09 02:22) [11]> [10] Германн © (09.09.09 01:23)
> > и оптимизировать надо обработку строк
Пока нет обработки строк. ТормозитREdit.Lines := FullText;
Может потому что переписывает данные. Если бы можно было дать RichEdit"y указатель, но TStringList это же не данные. Или можно это как-то сделать?
← →
Германн © (2009-09-09 02:34) [12]
> Пока нет обработки строк. Тормозит REdit.Lines := FullText;
>
> Может потому что переписывает данные.
Фантастика!
Оказывается она существует реально!
:)
← →
wah © (2009-09-09 02:49) [13]> [12] Германн © (09.09.09 02:34)
> Оказывается она существует реально!
Кто?
Я понимаю, что мои высказывания могут выглядеть довольно глупо. Но, имхо, чайникам это позволено.
Попытаюсь описать свою цель, может я с самого начала не туда зарулил.
Мне нужно отобразить плайн-текст с некоторым форматированием. Для этого я решил использовать формат xml. Хотя можно использовать и другой формат, просто нужно обозначить абзацы, которые должны выглядеть в RichEdit"e по разному. Я открываю файл, записываю формат каждой строки в StringList, потом убираю теги и записываю строки в RichEdit в нужном формате.
Вот примерно как-то так. Вероятно можно решить эту задачу проще и оптимальней. В связи с чем и прошу совета.
← →
Германн © (2009-09-09 02:57) [14]
> wah © (09.09.09 02:49) [13]
>
> > [12] Германн © (09.09.09 02:34)
> > Оказывается она существует реально!
>
> Кто?
> Я понимаю, что мои высказывания могут выглядеть довольно
> глупо. Но, имхо, чайникам это позволено.
> Попытаюсь описать свою цель, может я с самого начала не
> туда зарулил.
> Мне нужно отобразить плайн-текст с некоторым форматированием.
> Для этого я решил использовать формат xml. Хотя можно использовать
> и другой формат, просто нужно обозначить абзацы, которые
> должны выглядеть в RichEdit"e по разному. Я открываю файл,
> записываю формат каждой строки в StringList, потом убираю
> теги и записываю строки в RichEdit в нужном формате.
> Вот примерно как-то так. Вероятно можно решить эту задачу
> проще и оптимальней. В связи с чем и прошу совета.
>
Чайникам дозволено почти всё. (Не дозволено только то, что запрещено правилами.)
Я и сам "чайник"!
Я только много чего не могу понять в сём сабже. Ну например "плайн-текст с некоторым форматированием".
← →
wah © (2009-09-09 03:13) [15]> [14] Германн © (09.09.09 02:57)
> "плайн-текст с некоторым форматированием".
плайн-текст отобразить с некоторым форматированием
← →
MonoLife © (2009-09-09 04:30) [16]> Для этого я решил использовать формат xml. Хотя можно использовать
> и другой формат, просто нужно обозначить абзацы, которые
> должны выглядеть в RichEdit"e по разному.
а может как раз при чтении xml тормоза и REdit ни причем?
← →
wah © (2009-09-09 04:55) [17]> [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;
Грузится в долю секунды. Но все равно хочется сделать прямее.
← →
MBo © (2009-09-09 06:56) [18]а REdit.Lines.Assign(FullText) ?
← →
AIK © (2009-09-09 07:52) [19]> for i := 0 to FullText.Count - 1 do
> begin
> // обработка содержимого StringList
> end;
Покажи что за "обработка содержимого StringList"
← →
wah © (2009-09-09 11:11) [20]> [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-й пень. Попробуйте сами.
← →
wah © (2009-09-09 11:12) [21]> [18] MBo © (09.09.09 06:56)
> а REdit.Lines.Assign(FullText) ?
Абсолютно то же самое.
← →
Anatoly Podgoretsky © (2009-09-09 11:21) [22]> wah (09.09.2009 11:11:20) [20]
Если нет никакой обработка, то зачем же грузить в StringList
← →
wah © (2009-09-09 11:47) [23]> [22] Anatoly Podgoretsky © (09.09.09 11:21)
> Если нет никакой обработка, то зачем же грузить в StringList
Сейчас нет, потом будет.
← →
sniknik © (2009-09-09 15:52) [24]чудес не бывает, что то у тебя тормозит, поэтому сделай НОВЫЙ проект в котором нет и следа от обработок/циклов и любого другого не относящегося к обсуждению кода...
только ричедит и кнопка с кодом
FullText := TStringList.Create;
FullText.LoadFromFile("вот тут тоже не переменную а реальный путь, а то гадай тут, может у тебя файл в инете");
REdit.Lines.Assign(FullText);
все, другого кода быть не должно. тормозит? значит дело в данных, попробуй другой файл, пусть больше, но другой, можно несколько. тоже тормозит? выкладывай получившийся тестовый проект с исходным файлом куда нибудь на всеобщее обозрение. будем канонизировать...
← →
Sapersky (2009-09-09 17:12) [25]Автор, включай Use Debug DCUs и проходи отладчиком по "потрохам" REdit.Lines:=FullText.
(cобственно, я уже прошёл - тормозят, судя по всему, TRichEditStrings.GetCount и TRichEditStrings.Insert).
← →
wah © (2009-09-09 17:13) [26]> [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 тоже тормозит.
← →
wah © (2009-09-09 17:25) [27]> [25] Sapersky (09.09.09 17:12)
> Use Debug DCUs
Я до этого еще не дочитал. Что это и где про это читать?
> тормозят, судя по всему, TRichEditStrings.Get Count и TRichEditStrings.Insert).
То есть сама компонента виновата?
← →
Sapersky (2009-09-09 17:38) [28]> 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 18:27) [29]> [28] Sapersky (09.09.09 17:38)
Большое спасибо. Попробую с TMemoryStream. Тему можно закрывать.
И вообще всем, конечно, спасибо.
← →
MonoLife © (2009-09-10 03:00) [30]>wah ©
Может, вместо RichEdit, как вариант, заюзать TWebBrowser? Я, в свое время, отказался от RE пытаясь решать подобную задачу..
← →
wah © (2009-09-10 04:54) [31]> [30] MonoLife © (10.09.09 03:00)
> заюзать TWebBrowser?
У меня там типа редактора, поэтому наверное вряд ли.
← →
sniknik © (2009-09-10 09:38) [32]очень странно...
вчера на работе не было тормозов, не мог понять о чем вообще речь, вечером дома перепроверил, тормоза есть, сегодня убедится перепроверяю еще раз на работе тормозов нет! ... разница, на работе комп P4 3000 c 1.5 гигами памяти, и "свежая" установка (буквально неделю назад "полетел" системный диск пришлось переставлять), дома amd 3200+ и 2 гига памяти и забыл уже когда винду устанавливал (вроде в 2004-5 году). и там и там система XP. вот.
p.s. через стрим работает быстро и там и там.
p.p.s. вот уж не думал, а у меня куча мест где делается просто присвоение richedit.lines.text:= stringslist.text, что тоже тормозит проверял, хорошо не много данных так обычно обрабатывается, много я обычно в рекорсетах держу, но даже так, "тормоз" в секунду там где его вообще не должно быть... нехорошо.
← →
Andy BitOff © (2009-09-10 10:45) [33]Дык, что же это получается, братцы! РичЕдит это зло?
← →
Sapersky (2009-09-10 15:36) [34]Не то чтобы абсолютное зло, просто борландовцы в своё время малость поленились и сделали добавление строк из TStringList-источника через вызов в цикле универсальной функции TRichEditStrings.Insert, хотя правильнее было бы написать специализированную функцию.
Как её писать - есть такое предположение, что можно использовать метод, аналогичный TRichEditStrings.LoadFromStream (SendMessage(RichEdit.Handle, EM_STREAMIN,...), но без промежуточного стрима. Преобразование текста в LoadFromStream делается собственной функцией, которая передаётся в SendMessage в виде callback, и вроде бы ничто не мешает написать аналогичную функцию, использующую в качестве входных данных TStringList вместо TStream.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.11.01;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.006 c