Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
-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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.049 c
2-1168686353
Влад
2007-01-13 14:05
2007.01.28
Завершение работы.


2-1168113814
Officeman
2007-01-06 23:03
2007.01.28
TCPClient > TCPServer


15-1167991529
alexeis
2007-01-05 13:05
2007.01.28
Установить принтер, не подключая его


2-1168229678
Рекорд
2007-01-08 07:14
2007.01.28
Как быстро скопировать record ?


15-1168315256
Slider007
2007-01-09 07:00
2007.01.28
С днем рождения ! 9 января





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский