Урок 79 - Использование потоков данных (часть 3/3)

Звучит это все страшно, а используется очень просто. Вот пример.

var
  strm : IStream; 
  mem : TMemorySteam;
Begin
  mem := TMemorySteam.Create;
  strm := TStreamAdapter.Create(mem, soOwned) as IStream;
Все теперь передаем интерфейс strm в Dll ил вообще куда угодно и не думаем о уничтожении ни TStreamAdapter ни TMemorySteam, в нужное время они сами уничтожаться, тогда когда клиент закончит с ними работать.

Теперь рассмотрим случай, когда программа на делфи является не сервером, а клиентов, т.е. ей передают интерфейс IStream, объекта потока созданного неизвестно где. Идеально было бы если бы мы получили не IStream, а TStream, ведь все объекты VCL умеют работать именно с TStream, а работать с IStream они не умеют. Решение в лоб состоит в том, чтобы банально скопировать все данные из IStream например в TMemorySteam. Однако, таким образом мы получаем лишнее копирование. Это ничего, когда данных на 20кб, другое дело если их 1Гб, тогда дополнительное копирование выйдет боком. Для таких случаев предлагаю написать свой собственный адаптер, но уже не адаптер сервера, а клиента. Класс назвал TExternStream (от слова External т.е. внешний). Заодно это будет пример написания своего класса наследника TStream. Основная задача этого класса переадресовать все запросы интерфейсу внешнего объекта IStream. Сам интерфейс нужно передать в конструктор. В деструкторе интерфейс освобождается FSource := nil; в классе перекрыты все абстрактные методы Read, Write, виртуальный Seek, GetSize и SetSize.
type
  TExternStream = class(TStream)
  protected
    FSource : IStream;
    procedure SetSize(const NewSize: Int64); override;
  public
    constructor Create(Source : IStream);
    destructor Destroy; override;
    function Read(var Buffer; Count: Longint): Longint; override;
    function Write(const Buffer; Count: Longint): Longint; override;
    function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
  end;
procedure TForm1.FormCreate(Sender: TObject);
var
  T : TStreamAdapter;
begin
  RegisterComponents
end;
{ TExternStream }
constructor TExternStream.Create(Source: IStream);
begin
  inherited Create;
  FSource := Source;
end;
destructor TExternStream.Destroy;
begin
  FSource := nil;
  inherited;
end;
function TExternStream.Read(var Buffer; Count: Integer): Longint;
begin
  if FSource.Read(@Buffer, Count, @Result) <> S_OK
  then
    Result := 0;
end;
function TExternStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
  FSource.Seek(Offset, byte(Origin), Result);
end;
procedure TExternStream.SetSize(const NewSize: Int64);
begin
  FSource.SetSize(NewSize);
end;
function TExternStream.Write(const Buffer; Count: Integer): Longint;
begin
  if FSource.Write(@Buffer, Count, @Result) <> S_OK
  then
    Result := 0;
end;
Используется все это счастье следующим образм. Пусть в клиенсткую часть передали интерфейс strm : IStream, тогда создаем свой экземпляр класса TExternStream на базе этого strm и используем как любой другой объект наследник TStream. Напрмер вызываем Image1.Picture.Bitmap.LoadFromStream(aOut);
var
  aOut : TExternStream;
try
  aOut := TExternStream.Create(strm);
  Image1.Picture.Bitmap.LoadFromStream(aOut);
....
  aOut.Free; //Тут уничтожиться поток созданный в Dll, так как указатель на aStream занулиться. 
  


Удачи!
Встретимся в следующем уроке!




Добавил(а): v1dark Дата: 2013-11-20
Админ Написал бы многопоточний "бурт" и показал как изпользвоать потоки и обяснить там много чего есть.урок будет во


  1. YbtKD
    YbtKD 5 months ago
    Meds information sheet. Drug Class. <a href="https://viagra4u.top">where to buy cheap viagra online</a> in US. Best trends of medication. Read here.
    [url=https://applehall.com.ua/product/apple-imac-27-retina-5k-z0sc00055-2015]Actual trends of drugs.[/url] [url=https://lensesonline.kz/product/75/?rating=1]All what you want to know about meds.[/url] [url=http://www.puna.kr/nmprogram/board/default.asp?mod=o&amp;pc=Notice&amp;se=240781&amp;ct=p02&amp;st=&amp;op=&amp;key=&amp;word=&amp;idx=240781&amp;page=1]Actual news about medicines.[/url] 550b191
  2. 881333
    881333 2 months ago
    Таможенная компания "Азия-Трейдинг" осознаёт цену времени связанную с доставкой товаров из Китая в Россию и рисков связанные с таможенной очисткой. Мы стремимся создать лучшие условия работы во внешнеторговой деятельности для наших Клиентов.
  3. zofhmmpfyl
    zofhmmpfyl 2 months ago
    Урок 79 - Использование потоков данных (часть 3/3) - The Delphi
    zofhmmpfyl http://www.gbcdu5ucvvga6978l304q3x89207p82rs.org/
    [url=http://www.gbcdu5ucvvga6978l304q3x89207p82rs.org/]uzofhmmpfyl[/url]
    <a href="http://www.gbcdu5ucvvga6978l304q3x89207p82rs.org/">azofhmmpfyl</a>
  4. 635492
    635492 2 months ago
    Логистическая компания "Азия-Трейдинг" предлагает воспользоваться сервисом поставки мелкого груза из КНР – очень востребованная услуга и у предпринимателей, и частных лиц, желающих приобрести что-то для себя.
  5. ozfpkcnls
    ozfpkcnls a month ago
    Урок 79 - Использование потоков данных (часть 3/3) - The Delphi
    [url=http://www.g0t4w2ay363hd562s89p8kkl2cd1r0l7s.org/]uozfpkcnls[/url]
    <a href="http://www.g0t4w2ay363hd562s89p8kkl2cd1r0l7s.org/">aozfpkcnls</a>
    ozfpkcnls http://www.g0t4w2ay363hd562s89p8kkl2cd1r0l7s.org/
  6. oveoznphye
    oveoznphye a month ago
    Урок 79 - Использование потоков данных (часть 3/3) - The Delphi
    <a href="http://www.g494b5i9ay838it0jj9av1m410hy88qds.org/">aoveoznphye</a>
    [url=http://www.g494b5i9ay838it0jj9av1m410hy88qds.org/]uoveoznphye[/url]
    oveoznphye http://www.g494b5i9ay838it0jj9av1m410hy88qds.org/
  7. vocsykwow
    vocsykwow 27 days ago
    Урок 79 - Использование потоков данных (часть 3/3) - The Delphi
    [url=http://www.gw2lw2720w0029m3h9bwdyt3l71sm8h1s.org/]uvocsykwow[/url]
    <a href="http://www.gw2lw2720w0029m3h9bwdyt3l71sm8h1s.org/">avocsykwow</a>
    vocsykwow http://www.gw2lw2720w0029m3h9bwdyt3l71sm8h1s.org/
  8. lxzhhtzqb
    lxzhhtzqb 13 days ago
    Урок 79 - Использование потоков данных (часть 3/3) - The Delphi
    [url=http://www.g22622b17wlbc31i8h77m1d6eo9t6tvcs.org/]ulxzhhtzqb[/url]
    <a href="http://www.g22622b17wlbc31i8h77m1d6eo9t6tvcs.org/">alxzhhtzqb</a>
    lxzhhtzqb http://www.g22622b17wlbc31i8h77m1d6eo9t6tvcs.org/
Отменить.