Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
14-43871
Rouse_
2004-02-19 16:19
2004.03.14
Эх, поприкалываться чтоли под конец рабочего дня? ;)


1-43540
Talla2k
2004-02-27 01:55
2004.03.14
Траблы с OpenDialog


1-43590
Ivolg
2004-03-02 17:30
2004.03.14
Дата


14-43890
Думкин
2004-02-20 15:39
2004.03.14
С днем рождения! 20 февраля.


14-43842
Думкин
2004-02-22 06:14
2004.03.14
С днем рождения! 22 февраля.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский