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

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

Помогите с TServerClientThread в TServerSocket [D6, Win2k]


Страницы:   1 2

axx ©   (2003-12-30 13:56:00) 

Помогите плз а 3 часа ковыряюсь ничего понять не могу. Вроде все правельно делаю но вылазеет ошибка. При первом конекте все проходит гладко при втором конекте ошибка. Строка с ошибко помечена.

//ServerSocket OnGetThread
procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=TServerThread.Create(True,ClientSocket);
SocketThread.Priority := tpLower;
SocketThread.Resume;
end;

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

implementation

procedure TServerThread.ClientExecute;
begin
inherited FreeOnTerminate:=TRUE;
MySocketStream:=TWinSocketStream.Create(ClientSocket,100000);
// Выполняем некоторые операции В них точно нет ошибки.
MySocketStream.Free;
ClientSocket.Close; -Ошибка здесь
end;

end.


axx   (2004-01-06 09:34:00) [1]

то Rouse_
Спасибо.


Rouse_   (2004-01-06 09:31:00) [2]

> [18] axx © (06.01.04 09:15)
А также...
WriteBuffercalls Write to handle the actual writing. If the stream fails to write all the requested bytes, an EWriteErrorexception is raised.


Rouse_   (2004-01-06 09:29:00) [3]

> Если бы я ещё наворотил синхронизацию, начинающие бы в коде
> не разобрались.

А разве других способов обращения к VCL объектам из доп потока кроме как через синхронизацию не существует? Или вы про них забыли?
К примеру SendMessage...
И при чем тут Начинающие?

> [18] axx © (06.01.04 09:15)
ReadBuffercalls Read to do the actual reading. If Count bytes cannot be read from the stream, an EReadErrorexception is raised.


axx   (2004-01-06 09:15:00) [4]

Кстати господа подскажите методы ReadBuffer и WriteBuffer шлют и получают то количество байт которое указано вторым параметром или как получиться ?
{fSocketStream:TWinSocketStream
fSocketStream.ReadBuffer(td,128);
fSocketStream.WriteBuffer(td,128);}


Polevi   (2004-01-06 09:00:00) [5]

>ThreeDHead © (05.01.04 23:30) [16]
ну если нужно, тогда извините


ThreeDHead   (2004-01-05 23:30:00) [6]

2 Polevi
> я знаю куда тыкать, нечего каждые 10 мс будить поток чтобы проверить наличие данных в гнезде.

Это уже моё дело - "нечего" или "есть чего". Если я так делаю - значит мне так нужно. Может этот поток у меня ещё чем-нибудь занимается, например отправкой данных.

> обращение к Memo из дополнительного кодового потока тоже из "Writing server threads example" ???

Если бы я ещё наворотил синхронизацию, начинающие бы в коде не разобрались.
А по-хорошему, из потока обращаться к VCL-объектам без синхронизации нельзя, это верно.


Polevi   (2004-01-05 21:32:00) [7]

вдогонку
обращение к Memo из дополнительного кодового потока тоже из "Writing server threads example" ???


Polevi   (2004-01-05 21:27:00) [8]

я знаю куда тыкать, нечего каждые 10 мс будить поток чтобы проверить наличие данных в гнезде, это плохой стиль


ThreeDHead   (2004-01-05 21:24:00) [9]

2 Polevi
Уважаемый! Не надо воду лить и тыкать пальцем в тайм-ауты - открой Delphi Help -> DevGuide: Developing Internet applications -> Writing server threads example.

И да счастье тебе будет.


Polevi   (2004-01-05 18:32:00) [10]

вот смысл то мне и не нравится


ThreeDHead   (2004-01-05 18:21:00) [11]

2 Polevi
Вым число 10 не понравилось ?
Поставь другое - смысл останется прежним.


Polevi   (2004-01-05 15:53:00) [12]

if SocketStream.WaitForData(10) then
почему 10 ???


axx   (2004-01-05 13:29:00) [13]

Если этот пример плох то дайте плз нормальный.


ThreeDHead   (2004-01-05 11:49:00) [14]

2 Polevi
Это интересно чем ?


Polevi   (2004-01-05 09:31:00) [15]

плохой пример


ThreeDHead   (2004-01-04 23:49:00) [16]

Посмотри этот код:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
ServerSocket1: TServerSocket;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
ServerSocket: TServerSocket;
public
procedure ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
procedure ServerSocketThreadStart(Sender: TObject; Thread: TServerClientThread);
procedure ServerSocketThreadEnd(Sender: TObject; Thread: TServerClientThread);
end;

TMyServerClientThread = Class(TServerClientThread)
private
SocketStream: TWinSocketStream;
MySize: Integer;
Buffer: Array of Byte;
protected
procedure ClientExecute; override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket := TServerSocket.Create(Self);
ServerSocket.Port := 12345;
ServerSocket.ServerType := stThreadBlocking;
ServerSocket.OnGetThread := ServerSocketGetThread;
ServerSocket.OnThreadStart:= ServerSocketThreadStart;
ServerSocket.OnThreadEnd := ServerSocketThreadEnd;
ServerSocket.Open;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ServerSocket.Close;
ServerSocket.Free;
end;

procedure TMyServerClientThread.ClientExecute;
begin
SocketStream:= TWinSocketStream.Create(ClientSocket, 60000);
try
While (not Terminated) and
(ClientSocket.Connected)
do
begin
if SocketStream.WaitForData(10) then
begin
MySize:= ClientSocket.ReceiveLength;
if MySize > 0 then
begin
SetLength(Buffer, MySize);
try
MySize:= SocketStream.Read(Buffer[0], MySize);
Form1.Memo1.Lines.Add("Received Size = " + IntToStr(MySize));
finally
SetLength(Buffer, 0);
end;
end
else
begin
ClientSocket.Close;
Terminate;
end;
end;
end;
finally
SocketStream.Free;
end;
end;

procedure TForm1.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
Memo1.Lines.Add("ServerSocket Get Thread");
SocketThread:= TMyServerClientThread.Create(False, ClientSocket);
end;

procedure TForm1.ServerSocketThreadStart(Sender: TObject;
Thread: TServerClientThread);
begin
Memo1.Lines.Add("ServerSocket Thread Start");
Memo1.Lines.Add("ActiveConnections = " + IntToStr(ServerSocket.Socket.ActiveConnections));
end;

procedure TForm1.ServerSocketThreadEnd(Sender: TObject;
Thread: TServerClientThread);
begin
Memo1.Lines.Add("ServerSocket Thread End");
Memo1.Lines.Add("ActiveConnections = " + IntToStr(ServerSocket.Socket.ActiveConnections));
end;

end.


axx   (2004-01-04 09:29:00) [17]

Я готов к обсуждению темы. Ничего что я таким образом ее возобновляю ??? :)))))


Digitman   (2003-12-30 16:29:00) [18]

давай уже трезвей) ... потом и разберемся, на свежую голову


axx   (2003-12-30 16:16:00) [19]

Ой господа извините (пред новогодний период все же), но я уже пивом напитый. Но ответ нужон. Я чувствую с себе силы :)))


axx   (2003-12-30 16:14:00) [20]

Вылазеет дебагер с адресами забитыми ??????.
Я так понимаю что я чтото не фрю или не создаю, но что ?


Страницы:   1 2

Наверх

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