Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.01;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.016 c
2-1252998367
Онотоле
2009-09-15 11:06
2009.11.01
Прямоугольник выделения


2-1252269484
indiegod
2009-09-07 00:38
2009.11.01
Уничтожение динамического TImage


6-1209374740
AlexTitov
2008-04-28 13:25
2009.11.01
Как включить/выключить подключение по локальной сети? Варианты...


2-1252096753
Shyrick
2009-09-05 00:39
2009.11.01
Межпроцессное взаимодействие IPC


9-1183153929
Book
2007-06-30 01:52
2009.11.01
Поделитесь какимнибудь классом или функциями для сохранения в 3ds