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