Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1253019089
Achpile
2009-09-15 16:51
2009.11.01
Диалоги


15-1251745606
Kolan
2009-08-31 23:06
2009.11.01
Что нужно, чтобы сделать опенсорс проект?


2-1251457128
ArcticCat
2009-08-28 14:58
2009.11.01
Глюк с Win7


2-1252648119
Гость
2009-09-11 09:48
2009.11.01
Объявление переменной


3-1228849414
Falcom
2008-12-09 22:03
2009.11.01
Подключиться к MySQL из Delphi через Internet?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский