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

Вниз

Ускорение обменом сообщениями   Найти похожие ветки 

 
grvakh   (2002-10-15 11:13) [0]

Есть 2 машины, обменивающиеся малыми(<1 кб) даными. Сделано это на сокетах (Tserver|client socket). Особенностью задачи является поочередность отсылки: шлет одна и ждет прихода инф. с другой.
Какими методами, способами, настройками можно сей процесс ускорить? 2 канала (один - в одну, др - в др. сторону) уже пробовал...

grvakh


 
Digitman ©   (2002-10-15 12:14) [1]

А в чем проявляется замедление "сего процесса", по твоему мнению ?


 
grvakh   (2002-10-15 16:17) [2]

Когда данные идут в одну сторону - скорость работы более чем на порядок(sic!) выше, чем при ожидании подтверждения. :-(. Чем тут можно поиграть?Размерами пакета? Но обратно я отсылаю longint и всё. Thread -ами? (я пока без них). HAL как-то делает ведь.

c уважением
grvakh


 
Digitman ©   (2002-10-15 17:10) [3]

sic - это что ? сИкунды ?)
HAL - это что ? hardware abstraction layer ? он здесь ни при чем

thread"ы не дают никакого "ускорения" - вычисления в доп. thread"ах просто разгружают осн.поток (задача которого как правило - интерфейс взаимодействия с пользователем)


Приводи код приемника/передатчика


 
grvakh   (2002-10-16 09:47) [4]

---------
На стороне клиента

procedure TForm1.ClientSocketRead(Sender: TObject; Socket: сustomWinSocket);
var i,e:integer; w:longint;
begin w:=5757;
i:=socket.ReceiveLength;
if (nsrv =0) or (i=sizeof(nsrv)) then begin
i:=Socket.ReceiveBuf(nsrv,sizeof(nsrv));
exit;
end;
if i>8192 then begin
st2.Caption:="Buffer owerflow";
end; // Bufer overflow

i:=Socket.ReceiveBuf(par,sizeof(Array)*nsrv);

if i<0 then exit;
{ Здесь - обработка информации }
....
{ Здесь - обработка информации }

for i := 0 to Ss_OS.Socket.ActiveConnections-1 do
SS_OS.Socket.Connections[i].SendBuf(w,sizeof(w));
// Здесь - реализована "обратная связь. По идее, надо тоже клиентом
// А то небольшой изврат :(
end; { proc }
=================
На стороне сервера
procedure TForm1.btStartClick(Sender: TObject);
var i,j,e:integer;w:array[1..1024] of longint;
begin
if Ss_t.Socket.ActiveConnections=0 then exit;
if (not CS.active)and assigned(ss_t.Socket.Connections[0]) then begin
// Запускаем "клиента"
cs.Host :=ss_t.Socket.Connections[0].RemoteAddress;//ss_t.Socket.Connections[0].RemoteHost;
cs.Port := 7007;
{Пытаемся соединиться}
try cs.Open; except exit; end;
exit;
end;
for i := 0 to Ss_T.Socket.ActiveConnections-1 do begin
e:=SS_T.Socket.Connections[i].ReceiveLength;
if e>0 then
try e:=SS_T.Socket.Connections[i].ReceiveBuf(w,e);
except e:=0 end;
end; { for }

for i := 0 to Ss_T.Socket.ActiveConnections-1 do
SS_T.Socket.Connections[i].SendBuf(nsrv,sizeof(nsrv));
i:=0;
repeat
for j := 0 to Ss_T.Socket.ActiveConnections-1 do
e:=SS_T.Socket.Connections[i].Sendbuf(par,sizeof(array)*nsrv);
if e<0 then begin
statusbar1.simpletext:="Ошибка передачи данных !";
end;
//Собственно вычисления
....
//Собственно вычисления
repeat Application.ProcessMessages;
until clientConfirm;
inc(i);
until i>100000;
end;
Обратная связь - в отдельном "канале".
procedure TForm1.CSRead(Sender: TObject; Socket: TCustomWinSocket);
var w:longint; e:integer;
begin w:=0;
e:=socket.ReceiveBuf(w,4);
clientconfirm:= w=5757;
end;
--------------------------------


 
Polevi ©   (2002-10-16 10:06) [5]

каша


 
grvakh   (2002-10-16 10:15) [6]

Ну, есть конечно каша...Но в принципе-то!
А HAL - это одна из систем распределенного имитационного моделирования. Тренажеры. Sic - Так! (лат.) - т.е. "Даже вот так! ни ф... себе!" Извиняюсь за термины, не относящиеся к делу - привычка.

------


 
Digitman ©   (2002-10-16 10:24) [7]

1. Очень некорректно реализована обработка транспортных событий OnRead. Посмотри, как это сделано в демо-проекте scktsrvr.dpr.

2. Обработка принятой и проверенной на корректность инф-ции происходит в том же событии OnRead (т.е. - в событии трансп.уровня). Она может быть длительной, и это как раз и "тормозит" обмен сетевой обмен - пока процедура OnRead не завершится, очередное OnRead-событие будет ждать очереди на обработку (ибо события возбуждаются последовательно в контексте обработки оконных сообщений одного и того же код.потока - основного код.потока процесса)
При такой архитектуре на обеих сторонах необходимо выносить вычисления, связанные с обработкой принятых сообщений, в один или более доп.код.потоков, оставив за OnRead-обработчиком лишь трансп.ф-ции и ф-ции проверки очередных вх.сообщений на корректность структуры


 
grvakh   (2002-10-16 13:25) [8]

1. try try try ...я по-частям решаю эффективность/надежность, стараюсь не гнаться за 2 зайцами. Пример - спасибо, ознакомляюсь.
2 Т.е. самое лучшее - сделать задачу многопоточной?


 
Digitman ©   (2002-10-16 13:48) [9]

1. <Polevi> оч верно заметил : каша у тебя... разгребай и дели обработчик трансп.события на логически четкие и независимые субблоки - машина состояния, выборка из вх.потока, анализ на корректность и т.п.

2. Не всегда и не "самое лучшее", но достаточно оправданно в случаях длительной обработки поступающих запросов


 
grvakh   (2002-10-16 15:19) [10]

Спасибо!


 
grvakh   (2002-10-16 15:40) [11]

А если многопоточность-то каким путём: stThreadBlocking или породить отдельный поток для вычислений?


 
Digitman ©   (2002-10-16 15:51) [12]

А как угодно ! Суть от этого не меняется.
Просто stThreadBlocking-режим чуть облегчает задачу, ибо часть логики контроля за созданием/кэшированием/старт-стопом/уничтожением доп.потоков берет на себя класс TServerWinSocket.

С другой стороны скажу, что stThreadBlocking-режим введен Борландом в 1-ю очередь для выноса в доп.поток транспортного уровня коннекта, а не для бизнес-логики, реализующей обработку запросов ...



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

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

Наверх




Память: 0.5 MB
Время: 0.02 c
14-28229
Cr@sh
2002-11-17 18:08
2002.12.09
Подскажите самый дешевый платный хостинг


8-28136
j_onion
2002-08-23 03:00
2002.12.09
Как проверить, установлен ли конкретный кодек в системе?


3-27882
DmitryMN
2002-11-21 14:41
2002.12.09
Сжатие InterBase


1-27973
skirdov
2002-11-29 11:56
2002.12.09
Помогите разобраться с ValueListEditor


14-28268
Suntechnic
2002-11-18 16:31
2002.12.09
Это должно быть интересно...