Форум: "Сети";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];
ВнизПомогите с 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.012 c