Нужна помощь профессионального программиста - страница 22

 
prostotrader #:

Спасибо

До конца файла я не дошел :)

Добавлено

Вы поаккуратнее с этой таблицей, в ней много не правильного!

u2 UINT16 INTEGER Целое число размером 2 байта.

UINT16 - не может быть  INTEGER

и т.д

Почему не может? Эта колонка для ODBC.


 
Разобрался я с ДЛЛ - целевая платформа не та стояла. Надо, чтобы было x64.
 
Dmitriy Skub #:
Почему не может? Эта колонка для ODBC.


А-аа, ну да

 

Перехожу в режим online

end else                             // online
    begin
      if(Assigned(strData.Scheme) = true) then
      begin
        Buff:= PByteArray(msg^.data);
        s_desc:= cg_scheme_desc_t(strData.Scheme^);
        if(s_desc.scheme_type = CG_SCHEME_BINARY) then   //currently only CG_SCHEME_BINARY
        begin
          for i:= 0 to s_desc.num_messages - 1 do
          begin
            if(i = 0) then mess:= cg_message_desc_t(s_desc.messages^) else
              if((i > 0) and(i <= (s_desc.num_messages - 1))) then
                mess:= cg_message_desc_t(mess.next^);
            if(string(StrMess.msg_name) = string(mess.name)) then
            begin
              //YODO ????????
              //--    beep;
            end;
          end;
        end;
      end;
    end;
 

Дмитрий!

Когда дойдете до получения списка торгуемых инструментов (таблица fut_sess_contents)

Пожалуйста, напишите какое их количество у Вас.

 
prostotrader #:

Дмитрий!

Когда дойдете до получения списка торгуемых инструментов (таблица fut_sess_contents)

Пожалуйста, напишите какое их количество у Вас.

Хорошо. А что, не все? На тесте может быть.
 
Dmitriy Skub #:
Хорошо. А что, не все? На тесте может быть.

Нет опционов вообще и список из 78 инструментов

И почему-то снепшоты очень долго грузятся (~24-25 сек)


 

Вот время

Я понимаю, что нужно время для парсинга, но что-то очень много времени требуется...

Без парсинга ~2 секунды

Вот на это уходит 21 секунда!

function TCGMarketData.GetVarType(const aType: PAnsiChar): integer;
begin
  Result:= varUnknown;
  if(string(aType) = 'i1') then Result:= varShortInt else
  if(string(aType) = 'u1') then Result:= varByte else
  if(string(aType) = 'i2') then Result:= varSmallInt else
  if(string(aType) = 'u2') then Result:= varWord else
  if(string(aType) = 'i4') then Result:= varInteger else
  if(string(aType) = 'u4') then Result:= varLongWord else
  if(string(aType) = 'i8') then Result:= varInt64 else
  if(string(aType) = 'u8') then Result:= varUInt64 else
  if(string(aType) = 't') then Result:= varDate else
  if(string(aType) = 'f') then Result:= varSinpleDouble else
  if(string(aType) = 'a') then Result:= varChar else
  if(Pos('c', string(aType)) > 0) then Result:= varString else
  if(Pos('b', string(aType)) > 0) then Result:= varArray else
  if(Pos('d', string(aType)) > 0) then Result:= varDouble else
  if(Pos('s', string(aType)) > 0) then Result:= varDouble else
  if(Pos('z', string(aType)) > 0) then Result:= varZBinary;
end;

function TCGMarketData.PrepareVarArray(const Data: PByteArray; const sourse: cg_message_desc_t;
                             const pos: integer; var dest: TvarArray): integer;
var
  fild: cg_field_desc_t;
  j: integer;
  buffer: array of byte;
  aVarType: integer;
  h_res: CG_RESULT;
  inVal: int64;
  inSize: int8_t;
  ReplAct: int64;
begin
  result:= -1;
  SetLength(dest, sourse.num_fields);
  for j:= 0 to sourse.num_fields - 1 do
  begin
    if(j = 0) then fild:= cg_field_desc_t(sourse.fields^) else
      if((j > 0) and (j <= (sourse.num_fields - 1))) then
        fild:= cg_field_desc_t(fild.next^);
    if(string(fild.name) = 'replID') then Result:= PInt64(@Data^[fild.offset])^;
    if(string(fild.name) = 'replAct') then
    begin
       ReplAct:= PInt64(@Data^[fild.offset])^;
       if(ReplAct <> 0) then
       begin
         Result:= -1;
         exit;
       end;
    end;
    aVarType:= GetVarType(fild.fild_type);   // Get Variant type
    case aVarType of
      varShortInt: dest[j]:= PShortInt(@Data^[fild.offset])^;
      varByte: dest[j]:= PByte(@Data^[fild.offset])^;
      varSmallInt: dest[j]:= PSmallInt(@Data^[fild.offset])^;
      varWord: dest[j]:= PWord(@Data^[fild.offset])^;
      varInteger: dest[j]:= PInteger(@Data^[fild.offset])^;
      varLongWord: dest[j]:= PLongWord(@Data^[fild.offset])^;
      varInt64: dest[j]:= PInt64(@Data^[fild.offset])^;
      varUint64: dest[j]:= PUInt64(@Data^[fild.offset])^;
      varString: dest[j]:= string(PAnsiChar(@Data^[fild.offset]));
      varSinpleDouble: dest[j]:= PDouble(@Data^[fild.offset])^;  // fild type "f"
      varDate: dest[j]:= PUInt64(@Data^[fild.offset])^;
      varDouble: begin
//----------------  Warning! not support more then 19 gigits !!!! --------------
//----------------  26 digits converts same function              --------------
        h_res:= cg_bcd_get(@Data^[fild.offset], inVal, inSize);
        if(h_res = CG_ERR_OK) then
          dest[j]:= inVal.ToDouble /(Power(10.0, inSize));
      end;
      varArray: begin
        SetLength(Buffer, fild.size);
        Move(Data^[fild.offset], Buffer[0], fild.size);
        Move(Buffer[0], dest[j], fild.size);
      end;
      varChar: dest[j]:= PByte(@Data^[fild.offset])^;
      varZBinary: begin
        SetLength(Buffer, fild.size - 4);
        Move(Data^[fild.offset + 4], Buffer[0], fild.size - 4);
        Move(Buffer[0], dest[j], fild.size - 4);
      end;
      varUnknown: begin
        CGCntr.FmMemoStr:= 'Внимание: Неизвестный тип поля!';
        Synchronize(UpdMemo);
      end;
    end;
  end;
end;
Видимо нужно добавлять схему данных в новую таблицу, чтобы данные подготавливались быстрее
 
Парсится или загружается? Если парсится, то это долго. Пройдитесь отладчиком и будет понятно на чем затыкается.
 
Dmitriy Skub #:
Пройдитесь отладчиком и будет понятно на чем затыкается.

Парсится

Смотрел отладчиком, ничего хорошего

for j:= 0 to sourse.num_fields - 1 do

Поля лежат не в открытом виде, в виде указателей, в следующем указателе, указатель на следующий.

Поэтому никак нельзя ускорить процесс. Нужно каждый раз перебирать поля

if(j = 0) then fild:= cg_field_desc_t(sourse.fields^) else
      if((j > 0) and (j <= (sourse.num_fields - 1))) then
        fild:= cg_field_desc_t(fild.next^);
Причина обращения: