Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по указателям.


Страницы:   1 2

-John-Doe- ©   (2007-01-09 11:04:00) 

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ScktComp;

type
 TForm1 = class(TForm)
   ServerSocket1: TServerSocket;
   ClientSocket1: TClientSocket;
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
type
 TMemRec = record
  ms:TMemoryStream;
  index:integer;
 end;
 PMemRec = ^TMemRec;
var
 Form1: TForm1;
 f:pMemRec;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Open;
new(f);
f.ms:=TMemoryStream.Create;
f.index:=12321;
ClientSocket1.Socket.SendStream(f.ms) // (1)
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
showmessage(inttostr(f.index));
f.ms.Free;                           // (2)
end;

end.


На строке (2) - EAV. Если убрать строку (1), то все нормально. index, например, правильно выводиться. Подскажите как все-таки очистить ms?


Сергей М.   (2007-01-10 08:19:00) [1]


> если стрим объявлен в классе потока, то он не передается
> или передается не полностью другой программе


Ерунда полная.

Переменные (стрим-переменная - не исключение) можно объявлять где угодно, лишь бы это не противоречило правилам Паскаля.

Показывай тело метода Execute.


Palladin   (2007-01-10 06:31:00) [2]

ату его


ors_archangel   (2007-01-10 01:28:00) [3]


> я у Фленова прочел

зря ты это сказал


-John-Doe-   (2007-01-10 00:44:00) [4]

напишите плиз что не так раз так)) ?


-John-Doe-   (2007-01-09 18:41:00) [5]

я у Фленова прочел, что большой поток надо держать "живым" до тех пор, пока он не будет принят другой программой. я правильно его понял?

но если стрим объявлен в классе потока, то он не передается или передается не полностью другой программе.

ну вот я подумал что можно сделать дополнительный модуль со списком объектов на подобие TMemRec. тк одновременно выполняетсянесколько потоков то стримы можно передавать так:

1) когда в потоке готов стрим, то он посылает его, указав при этом порядковый номер - index, и создав в TList укзазатель на TMemRec с этим же индексом. при этом sendstream вызывать от потока в записи TMemRec .

2)когда другая программа полностью примет стрим, то посылает команду на очистку стрима с таким-то индексом.

может есть более корректный способ?


Сергей М.   (2007-01-09 12:34:00) [6]


> -John-Doe- ©   (09.01.07 12:16) [15]
> ну а что происходит когда Execute завершается?


В приведенном тобой коде нит никакого упоминания о TThread. Вместо этого я вижу, что метод SendStream вызывается тобой в основном потоке. Это во-первых.
Во-вторых, доп.поток, созданный объектом TThread, завершается не по факту возврата из вызова метода Execute, а позднее, после завершения некоторых внутренних вспомогательных технологических подпрограмм класса TThread, которые работают в контексте доп.потока, которые вызывают этот метод Execute  и которые вызывают в конечном итоге ф-цию ExitThread (собственно и завершающую работу доп.потока как объекта ОС)


-John-Doe-   (2007-01-09 12:27:00) [7]

виноват. объясню поподробнее:

сетевая прграмма. по комаде клиента создаеться поток в котором идет обработка MS, а потом это ms необходимо передать клиенту. сам ms объявлен в классе потока.

при тестировании я понял что после вызова socket.sendstream поток завершается и как мне показалось ms освобождается тк до клиента он так и не доходит.

я подумал что можно в создать новый унит а там список из элементов на подобие
TMemRec.

а потом вызывать socket.sendstream(ms) , а так же передовать клиенту index. Когда клиент примет поток, то пошлет команду очистить TMemRec с нужным индексом, найдя его в списке.


-John-Doe-   (2007-01-09 12:16:00) [8]


> Сергей М. ©   (09.01.07 12:10) [12]
>
>
> > после вызова socket.sendstream поток завершается
>
>
> С чего ты это взял ?


ну а что происходит когда Execute завершается?


Джо   (2007-01-09 12:11:00) [9]

А, да, сорри.


Сергей М.   (2007-01-09 12:10:00) [10]


> после вызова socket.sendstream поток завершается


С чего ты это взял ?


Плохиш   (2007-01-09 12:10:00) [11]


> Джо ©   (09.01.07 12:00) [9]

Это-то есть, просто я забыл, что делфи уже плювает на ^ для указателей на записи.

> -John-Doe- ©   (09.01.07 11:43) [6]

Ошибка в коде, с помощью которого ты пытаешься получить свой поток. Или в настроках соединения.


Джо   (2007-01-09 12:01:00) [12]

А что у тебя еще есть в программе, о чем нужно догадываться всезнающему All? ;->


-John-Doe-   (2007-01-09 12:00:00) [13]

new(f);

есть в procedure TForm1.Button1Click(Sender: TObject);


Джо   (2007-01-09 12:00:00) [14]

> [8] -John-Doe- ©   (09.01.07 11:59)
> А как надо?

Для f:pMemRec предварительно нужно выделить память.


-John-Doe-   (2007-01-09 11:59:00) [15]

А как надо?


Плохиш   (2007-01-09 11:51:00) [16]

Хм, посмотрел и увидел:

>   PMemRec = ^TMemRec;
> var
>  Form1: TForm1;
>   f:pMemRec;


> f.ms:=TMemoryStream.Create;

У Вас ошибки в 17х строках.


-John-Doe-   (2007-01-09 11:43:00) [17]

У меня в потоке обрабатывается стрим, а потом должен переслаться. после вызова socket.sendstream поток завершается. на другой конец поток так и не приходит :\


Плохиш   (2007-01-09 11:24:00) [18]


> -John-Doe- ©   (09.01.07 11:21) [4]
> 2 Плохиш
> те стрим освободиться автоматически после передачи?

да


-John-Doe-   (2007-01-09 11:21:00) [19]

2 Плохиш
те стрим освободиться автоматически после передачи?


-John-Doe-   (2007-01-09 11:19:00) [20]

Покажите на примере [0] пожалуйста.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо