Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
1-91332
Woland.hexed
2003-04-14 23:18
2003.04.28
Построение отчетов в стиле 1С (Excel)


14-91487
pi
2003-04-10 12:18
2003.04.28
Проблемы внедрения


6-91419
Leran2002
2003-02-28 10:40
2003.04.28
CGI+POST


14-91471
Шишкин Илья
2003-04-08 15:03
2003.04.28
Помогите с Internet Explorer


14-91450
Sergey
2003-04-11 11:29
2003.04.28
PHP скрипт конвертации базы Dbf->Oracle





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский