Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
3-27818
Skolotovich
2002-11-18 18:17
2002.12.09
QReport


6-28160
neodiX
2002-10-07 14:12
2002.12.09
Как послать SYN-ACK пакет?


1-28055
mazepa
2002-11-27 20:22
2002.12.09
х


3-27897
WD
2002-11-20 16:54
2002.12.09
Как открыть базу


3-27853
AndrewVolkov
2002-11-20 23:36
2002.12.09
TDbLookupComboBox - обнуление строки???





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