C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Memo работает медленно, как быстро загрузить в Memo 1mb текста?
Frip Nown
  Отправлено: 28.01.2007, 06:16


Ученик-кочегар

Группа: Участник
Сообщений: 3



Нужно в Memo руками загрузить текст из файла (метод LoadFromFile() не применим). Я читаю файл (вполне быстро), обрабатываю текст как мне нужно (тоже шустро получается), и делаю так:
mmData->Lines->Text=asData;

Вот эта строчка дико все тормозит. Подозреваю, проблема в типе AnsiString, но напрямую к массиву байт этот тип доступа не дает. Метод LoadFromFile() грузит текст практически моментально, значит выход есть. Какой?
nawok78
Отправлено: 29.01.2007, 08:29


Станционный диспетчер

Группа: Участник
Сообщений: 115



А сперва сделать LoadFromFile — потом над ним издеваться?
Grigoriy
Отправлено: 29.01.2007, 19:50


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (Frip Nown @ 28.01.2007, 06:16)
Подозреваю, проблема в типе AnsiString, но напрямую к массиву байт этот тип доступа не дает.

Дает.
CODE

char* cp = Edit1->Text.c_str();


И вообще, интересно, какая потребность загружать 1 MB текста в Memo ?
Этот текст нужно будет весь просматривать ?
Romikgy
Отправлено: 29.01.2007, 20:35


Дежурный стрелочник

Группа: Участник
Сообщений: 72



QUOTE (Frip Nown @ 28.01.2007, 05:16)
Нужно в Memo руками загрузить текст из файла (метод LoadFromFile() не применим). Я читаю файл (вполне быстро), обрабатываю текст как мне нужно (тоже шустро получается), и делаю так:
mmData->Lines->Text=asData;

Вот эта строчка дико все тормозит. Подозреваю, проблема в типе AnsiString, но напрямую к массиву байт этот тип доступа не дает. Метод LoadFromFile() грузит текст практически моментально, значит выход есть. Какой?

а что есть asData ?
Frip Nown
Отправлено: 29.01.2007, 21:39


Ученик-кочегар

Группа: Участник
Сообщений: 3



QUOTE
А сперва сделать LoadFromFile — потом над ним издеваться?
Настоящие герои всегда идут в обход =).
Обрабатывать посимвольно Ansi строку длинной в мегабайт будет долго — это я точно знаю. А если взять из нее указатель на символьный массив, придется его после обработки опять вгрузить в Memo — я вернусь к тому, с чего начал.

QUOTE
Дает:
char* cp = Edit1->Text.c_str();
c_str() — Функция, которая копирует символьный массив в новое место памяти и возвращает на него указатель. Это копия, к оригинальной строке получить доступ, по моему, нельзя.

QUOTE
И вообще, интересно, какая потребность загружать 1 MB текста в Memo ?
Этот текст нужно будет весь просматривать ?

Реально тексты чаще будут маленькие, но возможны и мегабайтные, и трехмегабайтные, и вообще =). Имхо, программа должна в любом случае работать быстро. Тем более, если она может работать быстро.

QUOTE
что есть asData ?
AnsiString. Или char*. Что угодно, это не принципиально. Вообще, конечный продукт метода обработки информации — символьный массив.
Grigoriy
Отправлено: 30.01.2007, 00:04


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (Frip Nown @ 29.01.2007, 21:39)
c_str() — Функция, которая копирует символьный массив в новое место памяти и возвращает на него указатель. Это копия, к оригинальной строке получить доступ, по моему, нельзя.

Нет, это указатель на оригинальную нуль-терминальную строку AnsiString-а.
Чтобы быстрее обработать строку — выделяем блок в памяти для результатирующей строки и в этот блок записываем..., а читаем... с исходной строки.

Можно заранее установить требуемый размер строки AnsiString его методом SetLength

Отредактировано Grigoriy — 30.01.2007, 00:06
Frip Nown
Отправлено: 30.01.2007, 01:46


Ученик-кочегар

Группа: Участник
Сообщений: 3



QUOTE
выделяем блок в памяти для результатирующей строки и в этот блок записываем..., а читаем... с исходной строки.
И что потом с этим новым блоком делаем? Как его привязать к анси строке? Собственно, уже не важно, но мне все равно интересно.

Моя проблема разрешилась весьма, э... неожиданно. Помогли танцы с бубном =).

У Memo есть такое свойвто — ParentFont. По умолчанию должно быть true, но у меня за каким-то чертом поменялось на false. И вот пока оно было false, memo работало медленно (грузило тестовый текст за 14.52сек). Как только я поменял ParentFont на true, тестовый текст начал грузится за 0.67. Такая вот, оптимизация одним движением руки =).


P.S. Всем спасибо!

Отредактировано Frip Nown — 30.01.2007, 01:48

Вернуться в Вопросы программирования в C++Builder