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

Вниз

Как быстро найти нужный массив, и сделать запись в него.   Найти похожие ветки 

 
ZV ©   (2011-01-26 14:11) [0]

Программа получает массивы   данных, всего есть 50 разных типов входящих данных для каждого пакета  входящих данных   создан массив для хранения . Во входящем пакете первые два байта являются идентификаторами которые указывают к какому типу они относятся.  Проблема заключается в том, что при получении пакета данных мне нужно определить  в какой массив  их записать, для этого я использую оператор       if     , получается, что у меня идет поочередное сравнение двух байт идентификатора с двумя байтами идентификатора массива    и если они совпали, то пишем в этот массив.  При большой скорости входа пакетов , программа начинает не успевать находить нужный массив и соответственно начинаются проблемы
Ниже приведен приблизительный код

ServerSocket1.Socket.Connections[i].ReceiveBuf(InData[0],1);
ServerSocket1.Socket.Connections[i].ReceiveBuf(InData[1],1);
if (InData[0]=3  and InData[1]=4) then begin ServerSocket1.Socket.Connections[i].ReceiveBuf(IDasas[0],100);
if (InData[0]=54  and InData[1]=140) then begin ServerSocket1.Socket.Connections[i].ReceiveBuf(IDwewe[0],100);

и так далее, всего 50 сравнений.

Хотелось бы узнать может можно как то сразу указать путь к нужному массиву используя два байта идентификатора?
Надеюсь Вы меня поняли.


 
Игорь Шевченко ©   (2011-01-26 14:39) [1]

таблицу и двоичный поиск по ней


 
KSergey ©   (2011-01-26 15:05) [2]

Два байта для 50 массивов - многовато, конечно, но т.к. память нынче дешевая, а вопрос скорости стоит остро - я бы сделал статический (да хоть и динамический) массив на 65536 элементов [0..65535], тип элементов этого массива - указатель на то, что нам нужно для соотв. типа. 50 элементов будет занято, остальные пустые, ну и ладно, 64Кб лишней памяти погоды не сделают точно.


 
KSergey ©   (2011-01-26 15:06) [3]

Соотв. "тип пакета" - это будет индекс в этом массиве.


 
Slym ©   (2011-01-27 06:49) [4]

ZV ©   (26.01.11 14:11)
ужасный код...
первое что бросается в глаза куча ServerSocket1.Socket.Connections[i].
кто мешает сделать так
with ServerSocket1.Socket.Connections[i] do
begin
 ReceiveBuf(InData[0],1);
 ReceiveBuf(InData[1],1);
 if (InData[0]=3  and InData[1]=4) then begin ReceiveBuf(IDasas[0],100);
 if (InData[0]=54  and InData[1]=140) then begin ReceiveBuf(IDwewe[0],100);
end;

второе


 
Slym ©   (2011-01-27 07:14) [5]

ReceiveBuf(InData[0],1);
ReceiveBuf(InData[1],1);
это что?
ReceiveBuf(InData[0],2); - и все (зависит от типа массива)
третье
такое колво ифов не рулит, выполнение однотипной команды после каждого ифа тоже не рулит...
рулит массив
type
 TPacketType=(IDasas,IDwewe,Undef);
 TSign=packed array[0..1] of byte;
const
 PacketSign:array[TPacketType] of TSign=((03,04),(54,140),(0,0));
 PacketLen:array[TPacketType] of integer=(100,100,0);

function GetPacketType(const Sign:TSign):TPacketType;
begin
 for result:=low(TPacketType) to high(TPacketType) do
   if word(PacketSign[result])=word(Sign) then
     exit;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Sign:TSign;
 PcktType:TPacketType;
 PcktLen:integer;
 Pckt:string;
begin
 with ServerSocket1.Socket.Connections[i] do
 begin
   ReceiveBuf(Sign,2);
   PcktType:=GetPacketType(Sign);
   PcktLen:=PacketLen[PcktType];
   SetLength(Pckt,PcktLen)
   ReceiveBuf(PChar(Pckt)^,PcktLen);
 end;
end;


 
Slym ©   (2011-01-27 07:46) [6]

ZV ©   (26.01.11 14:11)
Как быстро найти нужный массив, и сделать запись в него

var PcktData:array[TPacketType] of Pointer;
begin
 PcktData[IDasas]:=@IDasasArray;
 PcktData[IDwewe]:=@IDweweArray;
.....
 ReceiveBuf(PcktData[PcktType]^,PcktLen);


 
ZV ©   (2011-01-27 10:30) [7]

Slym, большое спасибо.
Мда, опыта в Delphi мне явно не хватает


 
Игорь Шевченко ©   (2011-01-27 11:31) [8]


> опыта в Delphi мне явно не хватает


нафиг тебе такой опыт



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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
2-1295681117
markers
2011-01-22 10:25
2011.05.01
COM объект и SafeArray


15-1295040591
Юрий
2011-01-15 00:29
2011.05.01
С днем рождения ! 15 января 2011 суббота


2-1295709528
Новик
2011-01-22 18:18
2011.05.01
Изменение поля ввода TEdit;


3-1257969789
Гарик
2009-11-11 23:03
2011.05.01
Привилегии на изменение таблиц в Firebird?


15-1295538997
polkin
2011-01-20 18:56
2011.05.01
Что-то знакомоеЮ мож знаете?