Форум: "Начинающим";
Текущий архив: 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