IBX: добавить время ожидания для TIBControlAndQueryService.InternalServiceQuery - PullRequest
1 голос
/ 16 июня 2011

Я хотел бы добавить опцию isc_info_svc_timeout (1 секунда) при вызове TIBControlAndQueryServiceGetNextLine. Я скопировал и изменил IBServices для добавления isc_info_svc_timeout к ServiceQueryParams после isc_info_svc_line аналогичным образом, как ServiceStartAddParam (значение: Integer; param: Integer), но я получаю сообщение об ошибке «функция не поддерживается» *

EDIT

Сначала я решил добавить тайм-аут во InternalServiceQuery, а не GetNextLine. Во-вторых, я добавлял параметр тайм-аута в FQueryParams, что я не должен. В-третьих, параметр timeout имеет свое собственное место в функции isc_service_query, 4 и 5 позиции (длина данных и указатель данных). Теперь это выглядит так, как будто работает, я имею в виду отсутствие ошибки «функция не поддерживается», но, к сожалению, это не так. После вызова GetNextLine (который вызывает InternalServiceQuery), когда нет данных для отправки обратно, мое приложение зависает и ожидает данные, как будто параметр timeout не действует.

procedure TIBCustomService.InternalServiceQuery;

  function AddParam (Value: Integer; param: Integer): string;
  begin
  Result  := Char(Param) +
         PChar(@Value)[0] +
         PChar(@Value)[1] +
         PChar(@Value)[2] +
         PChar(@Value)[3];
  end;

var
  FTimeout: string;
  PTimeout: PChar;
  FTimeoutLen: short;
begin
  FTimeout := AddParam(1, isc_info_svc_timeout);
  FTimeoutLen := Length(FTimeout);
  PTimeout := nil;
  IBAlloc(PTimeout, 0, FTimeoutLen);
  Move(FTimeout[1], PTimeout[0], FTimeoutLen);

  FQuerySPBLength := Length(FQueryParams);
  if FQuerySPBLength = 0 then
    IBError(ibxeQueryParamsError, [nil]);
  IBAlloc(FQuerySPB, 0, FQuerySPBLength);
  Move(FQueryParams[1], FQuerySPB[0], FQuerySPBLength);
  if (FOutputBuffer = nil) then
    IBAlloc(FOutputBuffer, 0, FBufferSize);
  try
  if call(FGDSLibrary.isc_service_query(StatusVector, @FHandle, nil,
               FTimeoutLen, PTimeout,
               FQuerySPBLength, FQuerySPB,
               FBufferSize, FOutputBuffer), False) > 0 then
  begin
...