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

Вниз

Помогите понять ServerSocket и его метод GetThread!!!   Найти похожие ветки 

 
Chak ©   (2003-03-05 11:04) [0]

Я непонимаю, как нужно использовать var SocketThread: TServerClientThread и как предопределить ClientExecute!!! Помогите разобраться.


----------------------------------------
procedure TMain.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=TSocketFileThread.Create(true,ClientSocket);
end;
----------------------------------------
...
TSocketFileThread= class(TServerClientThread)
private
FSocket: TServerClientWinSocket;
procedure SocketRead;
{ Private declarations }
protected
procedure ClientExecute; override;
public
constructor Create(NoStrart:Boolean; Socket: TServerClientWinSocket);
end;
...

constructor TSocketFileThread.Create(NoStrart:Boolean; Socket: TServerClientWinSocket);
begin
inherited Create(True,Socket);
FSocket:=Socket;
FreeOnTerminate := True;
Resume;
end;
...

procedure TSocketFileThread.ClientExecute;
begin
while (not Terminated) and ClientSocket.Connected do
begin
Synchronize(SocketRead);
inherited ClientExecute;
end;
end;
...



И еще по ходу вопрос: у меня ServerSocket1.SetverType:=stThreadBlocking
что должно стоять у клиента в свойстве ClientType?


 
Digitman ©   (2003-03-05 11:17) [1]

procedure TSocketFileThread.ClientExecute;
begin
while (not Terminated) and ClientSocket.Connected do
begin
// Synchronize(SocketRead); синхронизации нужно избегать и использовать только по реальной необходимости, иначе все преимущества мультипоточной параллельной обработки сводятся на нет
// inherited ClientExecute; это не нужно
end;

... здесь ты просто работаешь с методами приема/передачи объекта, ссылка на который передана тебе в конструкторе (св-во ClientSocket)

end;

1.
private
FSocket: TServerClientWinSocket;

это поле - лишнее, оно дублирует св-во ClientSocket

2.
FreeOnTerminate := True;

это недопустимо - диспетчеризацией/уничтожением твоего объекта-потока "заведует" кэш-менеджер объекта TServerWinSocket.


> у меня ServerSocket1.SetverType:=stThreadBlocking
> что должно стоять у клиента в свойстве ClientType?


То, что тебе удобней и предпочтительней по логике, то и ставь.
Режимы работы серверного и клиентского гнезд никак не связаны друг с другом


 
Chak ©   (2003-03-05 11:38) [2]

===> Digitman © (05.03.03 11:17)
Спасибо за науку!!!

есть еще вопрос:
правильно ли я пишу следующую процедуру?

procedure TSocketFileThread.ClientExecute;
begin
while (not Terminated) and ClientSocket.Connected do
begin
SocketRead; //процедура в которой я обрабатываю то что приходит (здесь я не использую Synchronize а только внутри самой процедуры SocketRead в случае необходимости - мне обязательно нужно чтоб в основном потоке виводилась информация про работу этого потока!!)
end;
end;



а твои слова ... здесь ты просто работаешь с методами приема/передачи объекта, ссылка на который передана тебе в конструкторе (св-во ClientSocket)
здесь это в процедуре TSocketFileThread.ClientExecute
или я могу и в своей процедуре SocketRead все обрабатывать?


 
Digitman ©   (2003-03-05 11:49) [3]


> правильно ли я пишу следующую процедуру?


это зависит от того, что делается в SocketRead;

кр.всего прочего нельзя "выпускать" потенциально возникающие в в методе ClientExecute, но необработанные ("непогашенные") исключения.

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

try
...
except
.. здесь, при необходимости. можно регистрировать исключения, ведя некий их лог
end;


> здесь это в процедуре TSocketFileThread.ClientExecute
> или я могу и в своей процедуре SocketRead все обрабатывать?


это уж как тебе будет удобно.
гораздо важней, что будет конкретно делаться в SocketRead, если ты выносишь транспортную логику в тело эту процедуру


 
Chak ©   (2003-03-05 18:05) [4]

Спасибо Digitman вроде все получается, но есть еще вопрос:

мне нужно чтоб из этого потока обновлялись данные на главной форме!!!, можеш чтото посоветовать?

и вообще, может есть у когото кусок работающего реально кода чтоб можно было с ним поработать и чемуто научиться, если не жалко конешно?

В проге которую делаю нужно чтоб клиент подсоединился к серверу и передал(получил) файлы, а на основной форме идет обновление листбокса и гауге!! с листбоксом все в порядке он обновляется во время работи с клиентом а вот с обновлением гауге ну никак!!! сплошные тормоза!!!

В одном потоке все работет, за исключением тормозов с обновлением гауге!!

Хочу всю работу с присоединенным клиентом вывести в отдельный поток с надеждой на то что это мне поможет!!!



 
Digitman ©   (2003-03-06 08:16) [5]

TMyThread = class(TThread)
..
FProgressPos : Integer;
..
end;

procedure TMyThread.DoProgress;
begin
MyForm.ProgressBar.Position := FProgressPos;
end;

procedure TMyThread.[Client]Execute;
begin
..
FProgressPos := FProgressPos + ...;
Synchronize(DoProgress);
..
end;



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

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

Наверх




Память: 0.49 MB
Время: 0.017 c
8-91415
Ricks
2003-01-22 15:51
2003.04.28
Два вопроса по OpenGL


3-91216
mars
2003-04-08 18:44
2003.04.28
Что умеет IBReplication manager?


1-91392
sAm_
2003-04-16 14:53
2003.04.28
Наиболее эффективный алгоритм генератора псевдослучайных чисел


4-91595
Mantic0re
2003-03-03 06:56
2003.04.28
Как раскрасить scrollbar и combobox?


14-91492
it
2003-04-10 00:18
2003.04.28
Получение файлов из подпапок