Показать сообщение отдельно
Старый 22.04.2009, 08:15   #1
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Счастье Lib_resloader - Экономная загрузка ресурсов

Представьте, что перед вами стоит банальная задача: загрузить какой-то текст из файла и отобразить его на экране.
Нет, не надо ломать голову.
Я знаю как вы поступите, готовая программа будет выглядеть примерно так:

Program Res01;
Var    
stempstring;
        
resresource;
        
iinteger;
        
function 
win2utf(sstring): string// Перекодировка из Win-1251 --> UTF-8
var    lenchinteger;
        
tstring;
begin
    t
:=''len:=Length(s)-1;
    for 
i:=0 to len do
    
begin
        ch
:=ord(GetChar(si));
        if 
ch>122 then t:=t+chr(ch+1104);
        else 
t:=t+chr(ch);
    
end;
    
win2utf:=t;
end;
        
Begin
    s
:='';
    
res:=OpenResource('/test.txt');
    
repeat
        temp
:=ReadLine(res);
        if 
temp='###' then break;
        
s:=win2utf(temp) + chr(10);
    
until false;
    
CloseResource(res);
    
ShowForm;
    
i:=FormAddString(s);
    
Delay(10000); // Небольшая задержка
End
А как вы думаете, много памяти тратится при чтении файла?
Я сделал простой тест. Загрузил файл размером 1024 байта (1 Кб) с 32 строками русского текста.
После запуска эмулятор WTK 2.5.2 мне выдал такой график:



Поясню график. Я запускал программу 2 раза. В первом случае до запуска программы памяти занято было 67500 байт, после запуска - 595124 байт, разница - 527624 байт. Во втором случае до запуска было 73256 байт, а после запуска - 540752 байт, разница - 467496 байт. То есть выходит, что на чтение файла размером 1Кб уходит до 515Кб памяти (!!!), а не каждый телефон может себе такое позволить. При тестировании на реальных телефонах (слабенькие Nokia, типа n7390 и проч.) вылетала ошибка Out of memory. Что и понятно.

Естественно, такое положение дел меня возмутило и я создал небольшую библиотеку для загрузки текста из файла.
Исходный код теперь заметно упростился:

Program Res02;
Uses resloader;
Var    
stempstring;
        
iinteger;
        
Begin
    s
:=LoadText('test.txt');
    
ShowForm;
    
i:=FormAddString(s);
    
Delay(10000); // Небольшая задержка
End
Но что же покажет тест?
После теста имеем такие показатели:


В цифрах это выглядит так:
Первый запуск: 88420 - 67520 = 20900 байт.
Второй запуск: 90056 - 75448 = 14608 байт.
Разница очевидна. В первом примере тратилось до 515Кб памяти, а во втором менее 20Кб.

Библиотека имеет команды сходные со стандартными:
OpenRes(f: string) - Открыть текстовый ресурс (символ "/" к имени добавлять не надо)
    f - имя файла
    
CloseRes - Закрыть ресурс

string ReadLine - прочитать строку из ресурса

string ReadByte - прочитать байт из ресурса

string win2utf(s: string) - Перекодировка текста из кодировки cp1251(Windows) в UTF-8

string LoadText(f: string) - Загрузка текста
    f - имя файла (символ "/" к имени добавлять не надо)
    При чтении проходит автоматическая перекодировка строк из cp1251 в UTF-8
    Строка ### понимается как маркер конца файла
    Строка # понимается как знак перевода строки
Как видите, ничего сложного. Всё просто и удобно. Проблема решена.
Вложения
Тип файла: zip Lib_resloader.zip (1.6 Кб, 935 просмотров)
Тип файла: zip Res01.zip (3.3 Кб, 878 просмотров)
Тип файла: zip Res02.zip (2.6 Кб, 862 просмотров)
(Offline)
 
Ответить с цитированием
Эти 11 пользователя(ей) сказали Спасибо odd за это полезное сообщение:
Amigo888 (15.01.2012), Android (21.05.2010), Cliffe Snake (18.05.2009), GRAY_WOLF (24.04.2009), NetBuilding (18.06.2010), Pyth_ON (15.05.2010), Romanzes (22.04.2009), Skythrone (24.04.2009), SmAlViK (07.05.2009), VM (22.04.2009), Winner (19.05.2009)