Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Освобождение потока... TMemoryStream 
:(
    Опции темы
BigTon
Дата 15.4.2007, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Мужики, недавно видел на форуме подобную проблему, но вот даже поиком искал не помогло, не могу найти и всё...
Код

Stream:TMemoryStream;
...
try
...
finally
Stream.Free;
end;

при особождении потока ошибка выскакивает и всё...а там где я читал было написано как подругому освобождать...

И второй ламерский вопросик: вот допустим клиент получил что хотел от сервера и передавать серверу будет ну как минимум через 30 минут результаты работы. Разорвётся ли за это время соединение? Надо ли его самому разрывать, а потом через 30 минут снова востанавливать?! как правильно вообще?!!

И третий....: на сервере пишу в tmemorystream несколько картинок, отправляю поток, как на клиенте восстановить из потока картики? Позиции tmemorystream после записи в него каждой картинки я сохраняю и тоже передаю клиенту, как это используя воостановить изображения???
PM MAIL   Вверх
MetalFan
Дата 15.4.2007, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



мда. один вопрос - одна тема.
по этому вопросу - где создается MemoryStream?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
BigTon
Дата 15.4.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



В ServerSocket1ClientRead. То есть приходит запрос на данные, я создаю поток, кидаю туда данные и хочу освободить поток, что для следующего запроса сформировать поток уже из других данных.
PM MAIL   Вверх
aktuba
Дата 16.4.2007, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 9
Всего: 38



Цитата

В ServerSocket1ClientRead. То есть приходит запрос на данные, я создаю поток, кидаю туда данные и хочу освободить поток, что для следующего запроса сформировать поток уже из других данных.


Ну так покажи полностью код!!! Из того, что ты привет, Metalfan правильно сказал - ошибка в том, что Stream не создается...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
BigTon
Дата 16.4.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Пожалуйста
Код

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  a,b,vv:string;
  ssss:array[1..10]of string;
  ba,i:integer;
begin
  a:=serversocket1.Socket.Connections[0].ReceiveText;
  b:=copy(a,0,4);

  if b='0100' then serversocket1.Socket.Connections[0].SendText('0002'+'/'+edit3.Text);

  if b='0200' then
    begin
      t:=tmemorystream.Create;

      ba:=strtoint(edit3.Text);
      i:=1;
      
      if ba>0 then
        begin
          advpicture2.Picture.SaveToStream(t);
          ssss[i]:=inttostr(t.Position);
          i:=i+1;
        end;
      if ba>1 then
        begin
          advpicture1.Picture.SaveToStream(t);
          ssss[i]:=inttostr(t.Position);
          i:=i+1;
        end;
      if ba>2 then
        begin
          advpicture3.Picture.SaveToStream(t);
          ssss[i]:=inttostr(t.Position);
          i:=i+1;
        end;
      if ba>3 then
        begin
          advpicture4.Picture.SaveToStream(t);
          ssss[i]:=inttostr(t.Position);
          i:=i+1;
        end;
      if ba>4 then
        begin
          advpicture5.Picture.SaveToStream(t);
          ssss[i]:=inttostr(t.Position);
          i:=i+1;
        end;
         
     t.Position:=0;

      for i:=1 to strtoint(edit3.Text) do vv:=vv+ssss[i]+'('+inttostr(i)+')';


      try
        serversocket1.Socket.Connections[0].SendText('0003'+'/'+vv+'0004');
        serversocket1.Socket.Connections[0].SendStream(t);
        serversocket1.Socket.Connections[0].SendText('0005');
      finally
        t.Free;

      end;

    end;

  if b='0300' then
    begin
      serversocket1.Socket.Disconnect(0);
      Edit2.Text:='diskonekt';
    end;
end;


PM MAIL   Вверх
Snowy
Дата 16.4.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Ну и где у тебя объявление t?
Она у тебя что, глобальная?  smile На сервере? smile 
Срочно переделывай на локальную!

Добавлено через 5 минут и 12 секунд
И что это за нелепая конструкция: serversocket1.Socket.Connections[0]
Тебе в функцию уже передали нужный Socket - с ним и работай.
PM MAIL   Вверх
BigTon
Дата 16.4.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Да, глобальная, учту замечание. А вообще я выяснил что в случае удачной отправки TMemoryStream сам освобождается, а освобождать его самому надо только в случае неудачной отправки...вот.
PM MAIL   Вверх
Snowy
Дата 16.4.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Освобождать нужно всегда!
А чудеса в твоём случае вызваны именно глобальностью.
PM MAIL   Вверх
GoingOnward
Дата 19.4.2007, 04:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  a,b,vv:string;
  ssss:array[1..10]of string;
  ba,i:integer;
  SRCL : TMemoryStream;
begin
  a:=serversocket1.Socket.Connections[0].ReceiveText;
  b:=copy(a,0,4);

  if b='0100' then serversocket1.Socket.Connections[0].SendText('0002'+'/'+edit3.Text);

  if b='0200' then
    begin
      SRCL := TMemoryStream.Create;
      Try

      ba:=strtoint(edit3.Text);
      i:=1;
      
      if ba>0 then
        begin
          advpicture2.Picture.SaveToStream(SRCL);
          ssss[i]:=inttostr(SRCL.Position);
          i:=i+1;
        end;
      if ba>1 then
        begin
          advpicture1.Picture.SaveToStream(SRCL);
          ssss[i]:=inttostr(SRCL.Position);
          i:=i+1;
        end;
      if ba>2 then
        begin
          advpicture3.Picture.SaveToStream(SRCL);
          ssss[i]:=inttostr(SRCL.Position);
          i:=i+1;
        end;
      if ba>3 then
        begin
          advpicture4.Picture.SaveToStream(SRCL);
          ssss[i]:=inttostr(SRCL.Position);
          i:=i+1;
        end;
      if ba>4 then
        begin
          advpicture5.Picture.SaveToStream(SRCL);
          ssss[i]:=inttostr(SRCL.Position);
          i:=i+1;
        end;
         
      SRCL.Position:=0;

      for i:=1 to strtoint(edit3.Text) do vv:=vv+ssss[i]+'('+inttostr(i)+')';

        serversocket1.Socket.Connections[0].SendText('0003'+'/'+vv+'0004');
        serversocket1.Socket.Connections[0].SendStream(SRCL);
        serversocket1.Socket.Connections[0].SendText('0005');
      finally
      SRCL.Free;
      End;

    end;

  if b='0300' then
    begin
      serversocket1.Socket.Disconnect(0);
      Edit2.Text:='diskonekt';
    end;
end;



Где-то так мож я там чёто пропустил я в тект редакторе правил ...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0653 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.