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

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

Нужна помощь


Страницы:   1 2

просто_ник ©   (2007-06-28 23:47:00) 

TServerSocket -> stThreadBlocking -> как в етом случае отправить TFileStream, или бесполезно


SlymRO   (2007-07-02 08:37:00) [1]

while (not Terminated) and(ClientSocket.Connected) do begin
if (not Terminated) and
 (not fSocketStream.WaitForData(1000)) then  else...

НЕЛЬЗЯ ТАК!
просто_ник ©   (29.06.07 13:49) [24]
что там что - то  не разрушается до конца

Так и есть... Кэш в 10 потоков (по деволту)...
Terminated может и ненаступить! твой флаг ClientSocket.Connected и только!
и никаких FreeOnTerminate... сервер сам разберется что и когда ему Free


Сергей М.   (2007-06-29 13:56:00) [2]

Ну прлоехали знач проехали.
Жаль вот только, что ты так и не разобрался в сабже, предпочтя объехать его через Китай)


просто_ник   (2007-06-29 13:54:00) [3]

ладно, проехали, и конечно спасибо за активность я не ожидал таковую


Сергей М.   (2007-06-29 13:53:00) [4]


> слышал где-то


Я даже знаю где - в ресурсах ОБС.


просто_ник   (2007-06-29 13:49:00) [5]

а я слышал где-то (не в справке) что там что - то  не разрушается до конца


Сергей М.   (2007-06-29 13:43:00) [6]


> а FreeOnTerminate на случае неактивности сокета


Эт чего, прямо так в справке и написано - самоликвидироваться в таком-то случае ?

Отсебячина, барин, отсебячина)


> fSocketStream := TWinSocketStream.Create(ClientSocket,1000000);


Мог бы и не повторяться, я не слепой)


просто_ник   (2007-06-29 13:38:00) [7]

я вырывая код кусками (большой очень), кстати
ClientSocket.Close; fSocketStream.Free; в обработчике ошибок
а FreeOnTerminate на случае неактивности сокета

fSocketStream := TWinSocketStream.Create(ClientSocket,1000000);


Сергей М.   (2007-06-29 13:24:00) [8]


> проблема уже ж решена


Ну решена знач решена. Дело хозяйское. Только вот и не было никакой проблемы, а была лишь твоя ошибка в 17-й строке.


> inherited FreeOnTerminate := TRUE;


Зачем FreeOnTerminate ? Да еще и inherited ?


просто_ник   (2007-06-29 13:13:00) [9]

и еще
 while (not Terminated) and(ClientSocket.Connected) do begin
 if (not Terminated) and
  (not fSocketStream.WaitForData(1000)) then  else...

обработка ошибок и прочее, да все тут нормально


просто_ник   (2007-06-29 13:10:00) [10]

так проблема уже ж решена  
fSocketStream.CopyFrom(f,f.Size)

самое основное

type
 EServerThread = class( Exception );
 TServerThread = class( TServerClientThread )
   private
     fSocketStream : TWinSocketStream;
   public
     procedure ClientExecute; override;
 end;

implementation

uses Unit1;

procedure TServerThread.ClientExecute;
 f:TFileStream;
begin
 inherited FreeOnTerminate := TRUE;

 fSocketStream := TWinSocketStream.Create(ClientSocket,1000000);
 f:=TFileStream.Create('2.ddd',fmOpenRead);
 fSocketStream.CopyFrom(f,f.Size)

 ClientSocket.Close;
 fSocketStream.Free;

end;


Сергей М.   (2007-06-29 13:05:00) [11]


> проблема была в том что бы отправить файловый поток сервером
> в режиме stThreadBlocking


Ну так если она тебя еще волнует, прводи сюда свой код ClientExecute !

Я ж тебе еще в [6] это сказал, а тебя почему-то понесло на кл.сторону)


просто_ник   (2007-06-29 13:02:00) [12]

проблема была в том что бы отправить файловый поток сервером в режиме stThreadBlocking клиенту и не терять преимущества stThreadBlocking, как клиент будет их принимать или не будет вообще без разницы.
SendStream в етом случае отпадает, с кодом на сервере думаю все нормально, я хотел услышать что-то наподобие fSocketStream.CopyFrom(f,f.Size) - что пришло мне методом научного тыка


Сергей М.   (2007-06-29 12:55:00) [13]

Так-с.

Ты вообще о чем  - о сервере ?

Судя по TServerSocket-> stThreadBlocking - именно о нем.

Так какого же ляда ты приплел сюда клиента и приводишь код клиента, а не сервера ?


просто_ник   (2007-06-29 12:53:00) [14]

обработчик вырван из кода поетому некоторые выщи например temp:=Socket.ReceiveText, я случайно пропустил, извиняюсь


просто_ник   (2007-06-29 12:51:00) [15]

обработка OnRead выполняется клиентом, который даже не подозревает в каком режиме работает сервер, а сервер соотвественно не подозревает в каком режиме работает клиент или даже какая там ОС


Сергей М.   (2007-06-29 12:45:00) [16]


> клиенту ж в принцыпе без разницы в каком режиме работает
> сервер


Совершенно верно.


> преимущества нужны для сервера


Вот как раз их ты и лишаешься, потому что обработка OnRead выполняется в основномтреде.


> с OnRead думаю все в порядке


Далеко не все в порядке !

Это что, полныйтекст обработчика ?

И где в нем собственно тот самый SendStream ?


просто_ник   (2007-06-29 12:37:00) [17]

а с OnRead думаю все в порядке

procedure TForm18.dreamClientSocketRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
 command:integer;
 temp:string;
begin

if SizeStream=0 then begin
 command:=StrToInt(Copy(temp,0,4));
 case command of
 7044:begin
   activCopy:=true;
   GlobalCommand:=command;
   command:=0;
   Delete(temp,1,4);
   temp2:=copy(temp,0,Pos('*',temp)-1);
   Delete(temp,1,Pos('*',temp));
   sizeStream:=StrToInt(temp2);

   GlobalFileStream:=TFileStream.Create(globalFileName,fmCreate);
   GlobalFileStream.Position:=0;
   GlobalFileStream.Write(temp[1],Length(temp));

   GlobalDisconnect.fileNameSave:=globalFileName;
   GlobalDisconnect.login:=Edit1.Text;
   GlobalDisconnect.Size:=sizeStream;
   GlobalDisconnect.SizeDisconnect:=GlobalFileStream.Size;
   speed:=speed+GlobalDisconnect.SizeDisconnect;
     if GlobalFileStream.Size=sizeStream then begin
     command:=GlobalCommand;
     sizeStream:=0;
     GlobalCommand:=0;
     GlobalDisconnect.open:=false;
     end;
 end;
 0999:;
 end;
 end else begin
 case GlobalCommand of
   7044:begin
   GlobalDisconnect.open:=true;
   GlobalFileStream.Position:=GlobalFileStream.Size;
   GlobalFileStream.Write(temp[1],Length(temp));

   progressBar(@bm1);

     if GlobalFileStream.Size=sizeStream then begin
     command:=GlobalCommand;
     GlobalCommand:=0;
     sizeStream:=0;
     end;
   end;
 end;
 0999:;  
 end;
 end;

 case command of
 7044:begin
 activCopy:=false;
 GlobalFileStream.Free;
 end;
 0999:;
 end;

end;


просто_ник   (2007-06-29 12:28:00) [18]

клиенту ж в принцыпе без разницы в каком режиме работает сервер, преимущества нужны для сервера, клиенты много передавать не будут


Сергей М.   (2007-06-29 12:26:00) [19]

SendStream тоже обязан работать.

Другой вопрос что вызов тобой в OnRead/OnWrite любогоиз методов передачи лишает тебя всех преимуществ ThreadBloking-режима.


просто_ник   (2007-06-29 12:21:00) [20]

а если fSocketStream.CopyFrom(f,f.Size), вроде бы работает, только-что проверил принял 3 мг


Страницы:   1 2

Наверх

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