Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.14;
Скачать: CL | DM;

Вниз

Помогите с TServerClientThread в TServerSocket   Найти похожие ветки 

 
axx ©   (2003-12-30 13:56) [0]

Помогите плз а 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.


 
Digitman ©   (2003-12-30 15:55) [1]


> Ошибка здесь


какая ?


 
axx ©   (2003-12-30 16:14) [2]

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


 
axx ©   (2003-12-30 16:16) [3]

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


 
Digitman ©   (2003-12-30 16:29) [4]

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


 
axx ©   (2004-01-04 09:29) [5]

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


 
ThreeDHead ©   (2004-01-04 23:49) [6]

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

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.


 
Polevi ©   (2004-01-05 09:31) [7]

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


 
ThreeDHead ©   (2004-01-05 11:49) [8]

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


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

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


 
Polevi ©   (2004-01-05 15:53) [10]

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


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

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


 
Polevi ©   (2004-01-05 18:32) [12]

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


 
ThreeDHead ©   (2004-01-05 21:24) [13]

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

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


 
Polevi ©   (2004-01-05 21:27) [14]

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


 
Polevi ©   (2004-01-05 21:32) [15]

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


 
ThreeDHead ©   (2004-01-05 23:30) [16]

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

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

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

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


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

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


 
axx ©   (2004-01-06 09:15) [18]

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


 
Rouse_ ©   (2004-01-06 09:29) [19]

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

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

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


 
Rouse_ ©   (2004-01-06 09:31) [20]

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


 
axx ©   (2004-01-06 09:34) [21]

то Rouse_
Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2004.03.14;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.042 c
1-43639
Тимохов
2004-03-02 12:37
2004.03.14
Ищу процедуру из группы Finalize+Initialize


14-43805
Kair
2004-02-23 09:05
2004.03.14
Оценка звука


3-43301
3APA3A
2004-02-11 11:38
2004.03.14
приведение типов в SQL


1-43612
GrTik
2004-03-01 18:13
2004.03.14
Удалять ли самому обьекты?


14-43794
uw
2004-02-18 16:33
2004.03.14
Новости с подлодки