Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Вопрос по указателям.   Найти похожие ветки 

 
-John-Doe- ©   (2007-01-09 11:04) [0]

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?


 
Ega23 ©   (2007-01-09 11:11) [1]


> Подскажите как все-таки очистить ms?


Обернуть TMemRec в класс.


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


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

Прочитай хинт в справке по SendStream там всё описано...


 
-John-Doe- ©   (2007-01-09 11:19) [3]

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


 
-John-Doe- ©   (2007-01-09 11:21) [4]

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


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


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

да


 
-John-Doe- ©   (2007-01-09 11:43) [6]

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


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

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

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


> f.ms:=TMemoryStream.Create;

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


 
-John-Doe- ©   (2007-01-09 11:59) [8]

А как надо?


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

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

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


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

new(f);

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


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

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


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


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


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


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


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

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

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

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


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

А, да, сорри.


 
-John-Doe- ©   (2007-01-09 12:16) [15]


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


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


 
-John-Doe- ©   (2007-01-09 12:27) [16]

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

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

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

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

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


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


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


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


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

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

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

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

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

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

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


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

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


 
ors_archangel ©   (2007-01-10 01:28) [20]


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

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


 
Palladin ©   (2007-01-10 06:31) [21]

ату его


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


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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.01.28;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.064 c
6-1156606780
DVM
2006-08-26 19:39
2007.01.28
Неблокирующие сокеты на WinAPi.


15-1167920399
vidiv
2007-01-04 17:19
2007.01.28
Движок для чата


2-1168290903
Wind
2007-01-09 00:15
2007.01.28
Сосчитать количество дней


2-1168513227
GrayMan
2007-01-11 14:00
2007.01.28
Delphi приложение на Интернет странице


2-1168324543
Extar
2007-01-09 09:35
2007.01.28
Чтобы не изобретать велосипед...