![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Добрый день. Есть следующая ситуация :
- программа по УРЛ загружает множество картинок с сайтов записывает их в указанный каталог на ЖД под своими собственными именами. все очень наглядно, можно просмотреть, если нужно, картинки - на текущем этапе уже не нужно просматривать картинки, и значит не нужно записывать их на ЖД. лучше сразу в ГлобПерем. Вопрос : какого типа нужно использовать переменную, учитывая что : - файлы графические(бинарные?) - размер файла от 1 до 1000 кб - число файлов - тысячи - общий объем загрузки может состовлять ?сотни мегабайт - желательно чтобы метод был универсальный(веб-страницы то же чтоб можно было сохранять) - не было потенциальной возможности сбоя(из за типа переменной) при хранении данных в ОЗУ |
|
#2
|
||||
|
||||
|
Хранить файлы в переменных невозможно. Переменная хранит обычно от 1 до 4 байт.
Последний раз редактировалось NumLock, 05.03.2017 в 20:14. |
|
#3
|
|||
|
|||
|
TStringList ну пускай объект-класс. не надо придираться по мелочам
|
|
#4
|
||||
|
||||
|
А почему не TList<TJPEGImage> ?
|
|
#5
|
||||
|
||||
|
Цитата:
Код:
uses UrlMon;
procedure TForm1.Button1Click(Sender: TObject);
var
URLfile, Fname: string;
begin
// "УРЛ...картинки"
URLfile:= 'http://kaifolog.ru/uploads/posts/2011-10/1319535258_002.jpg';
// "указанный каталог"
Fname:= ExtractFilePath(ParamStr(0)) +
// "под своими собственными именами"
Copy(URLfile,LastDelimiter('/',URLfile)+1,Length(URLfile));
// "можно просмотреть...картинки" если уже есть на диске
if FileExists(Fname) then Image1.Picture.LoadFromFile(Fname)
else
// или "записывает их в указанный каталог на ЖД"
UrlDownloadToFile(nil,PAnsiChar(URLfile),PAnsiChar(Fname),0,nil);
end; |
|
#6
|
|||
|
|||
|
Alegun, спасибо за внимание, но
Цитата:
еще раз, прям сейчас : - многопоточные загрузчики, под управление диспетчера потоков, грузят в указанный каталог на ЖД графические файлы разных типов и размеров - по окончании загрузки имена файлов записываются в список ТСтрингЛист - в цикле ДЛЯ файлы вызываются по имени и анализируются по указанным параметрам (размер файла, тип файла, ширина-высота файла) и ИМЕНА файлов сортируются в списке по правилам - файл с первым именем в списке(с самым большим индексом) вызывается, обрабатывается и сохраняется в другом каталоге с другим именем - в первом каталоге все файлы удаляются Следующий цикл загрузки картинок, и так тыщи циклов мне не нравится первый пункт, запись файлов на ЖД. оно совершенно не нужно. вопрос в какой потомок ТСтрингс(или куда еще) и как записать множество самых разных типов файлов. но только не надо догадки тут постить. если нет реального опыта, писать не надо. |
|
#7
|
|||
|
|||
|
Например, сохранять не в файл, а в TMemoryStream. Только тип файла надо хранить где-нибудь в другом месте.
|
|
#8
|
|||
|
|||
|
Ну а классы и дженерики тебе нафига даны.
Код:
interface
type
TMemDataType = (mdtJpeg, mdtHtml);
TMemData = class
private
FDataType : TMemDataType;
FData : TStream;
public
constructor Create(ADataType : TDataType; AData : TStream);
property DataType : TDataType read FDataType;
property Data : TStream read FData;
end;
// Если нужно что-то специфичное, то "рожаем" наследников
TJpegMemData = class(TMemData)
private
FWidth : Integer;
FHeight : Integer;
public
constructor Create(AData : TStream; AWidth, AHeight : Integer);
property Width : Integer read FWidth;
property Height : Integer read FHeight;
end;
// А тут список для хранения всего этого счастья
var
LoadedData : TObjectList<TMemData>;
implementation
constructor TMemData.Create(ADataType : TDataType; AData : TStream);
begin
inherited;
FDataType := ADataType;
FData := AData;
end;
constructor TJpegMemData.Create(AData : TStream; AWidth, AHeight : Integer);
begin
inherited Create(mdtJpeg,AData);
FWidth := AWidth;
FHeight := AHeight;
end;
// Создание и удаление глобального списка
initialization
LoadedData := TObjectList<TMemData>.Create;
finallization
FreeAndNil(LoadedData);
end.Как то так. Только не забыть при работе со списком обеспечить потокозащищенность. ЗЫ. А вообще зачем хранить все в памяти, если потом идет обработка и удаление лишнего и сохранение только полезного. Может проще просто прямо в потоке проанализировать и не сохранять ничего лишнего? |
|
#9
|
|||
|
|||
|
Цитата:
Наверно потому что загрузка картинок многопоточная и ассинхронная. вначале нужно загрузить ВСЕ картинки и только потом их анализировать. вот именно для этого их нужно где то хранить. пока на ЖД. но чтобы не пилить ЖД(и ССД тоже не любят лишние циклы записи) и нужно НАКАПЛИВАТЬ граф.файлы в ОЗУ. ну теперь то уже все понятно? |
|
#10
|
||||
|
||||
|
Цитата:
|