![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужна помощь
просто_ник © (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 мг