Последняя версия DataExpress 3 beta от 7 декабря 2019 года.
Изображение Скачать | Изображение Что нового?
См. также: Энциклопедия DX | Форум на develop-soft | Песочница
ИзображениеИзображениеИзображение

Обсуждение релиза 3 beta (08.10.18)

Аватара пользователя
kaltsone
Знаток
Сообщения: 527
Зарегистрирован: Вт май 16, 2017 10:34 am
Откуда: Киев

Обсуждение релиза 3 beta (08.10.18)

Сообщение kaltsone » Вт окт 09, 2018 8:47 am

+

Аватара пользователя
Гocть
Эксперт
Сообщения: 1586
Зарегистрирован: Пн ноя 27, 2017 8:02 am
Поблагодарили: 9 раз

Re: Обсуждение релиза 3 beta (08.10.18)

Сообщение Гocть » Пн окт 15, 2018 10:16 pm

Почему то, даже в асинхронном режиме с выводом в OnFinish Http клиент подвешивает окно. Это так и должно быть или поправимо?
Фрилансер. Разработка на заказ. Консультирование.

Аватара пользователя
admin
Разработчик
Сообщения: 4630
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская
Благодарил (а): 20 раз
Поблагодарили: 95 раз

Re: Обсуждение релиза 3 beta (08.10.18)

Сообщение admin » Пн окт 15, 2018 10:50 pm

Приложите пример базы.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1586
Зарегистрирован: Пн ноя 27, 2017 8:02 am
Поблагодарили: 9 раз

Re: Обсуждение релиза 3 beta (08.10.18)

Сообщение Гocть » Пн окт 15, 2018 11:42 pm

Базы как таковой нет. Скрипт отличается от примера в вики тем, что нет прогресса и отмены, создание клиента выполняется в момент запроса и по OnFinish вывожу Content (json текст небольшого объема в debug'е). Async разумеется true. Из особенности опрашиваемого сервера можно отметить его перегруженность каждого 15 числа (пинг нормальный, но тупит страшно). Контент от запроса в минуты просветов возвращается через секунду, две и в момент нагрузки до 5, 8 секунд. И на это время жизнь в программе замирает.
В принципе вроде и все.
Фрилансер. Разработка на заказ. Консультирование.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1586
Зарегистрирован: Пн ноя 27, 2017 8:02 am
Поблагодарили: 9 раз

Re: Обсуждение релиза 3 beta (08.10.18)

Сообщение Гocть » Вт окт 16, 2018 9:39 am

Вот сам код. Токен пришлось убрать, ответ будет 401

Код: Выделить всё

var ScriptEngine:variant;

procedure InitScriptEngine;
begin
  ScriptEngine := CreateOleObject('MSScriptControl.ScriptControl');
  ScriptEngine.Language := 'JScript';
  ScriptEngine.Reset;
  ScriptEngine.AddCode(
'if(typeof JSON!=="object"){JSON={}}(function(){"use strict";var rx_one=/^[\],'+
':{}\s]*$/;var rx_two=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;var rx_three=/"[^"'+
'\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;var rx_four=/(?'+
':^|:|,)(?:\s*\[)+/g;var rx_escapable=/[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0'+
'600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\uff'+
'f0-\uffff]/g;var rx_dangerous=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u'+
'200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;function f(n){ret'+
'urn(n<10)?"0"+n:n}function this_value(){return this.valueOf()}if(typeof Date.'+
'prototype.toJSON!=="function"){Date.prototype.toJSON=function(){return isFini'+
'te(this.valueOf())?(this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(t'+
'his.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f'+
'(this.getUTCSeconds())+"Z"):null};Boolean.prototype.toJSON=this_value;Number.'+
'prototype.toJSON=this_value;String.prototype.toJSON=this_value}var gap;var in'+
'dent;var meta;var rep;function quote(string){rx_escapable.lastIndex=0;return '+
'rx_escapable.test(string)?"\""+string.replace(rx_escapable,function(a){var c='+
'meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(1'+
'6)).slice(-4)})+"\"":"\""+string+"\""}function str(key,holder){var i;var k;va'+
'r v;var length;var mind=gap;var partial;var value=holder[key];if(value&&typeo'+
'f value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)'+
'}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof v'+
'alue){case"string":return quote(value);case"number":return(isFinite(value))?S'+
'tring(value):"null";case"boolean":case"null":return String(value);case"object'+
'":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString'+
'.apply(value)==="[object Array]"){length=value.length;for(i=0;i<length;i+=1){'+
'partial[i]=str(i,value)||"null"}v=partial.length===0?"[]":gap?("[\n"+gap+part'+
'ial.join(",\n"+gap)+"\n"+mind+"]"):"["+partial.join(",")+"]";gap=mind;return '+
'v}if(rep&&typeof rep==="object"){length=rep.length;for(i=0;i<length;i+=1){if('+
'typeof rep[i]==="string"){k=rep[i];v=str(k,value);if(v){partial.push(quote(k)'+
'+((gap)?": ":":")+v)}}}}else{for(k in value){if(Object.prototype.hasOwnProper'+
'ty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+((gap)?": ":":")'+
'+v)}}}}v=partial.length===0?"{}":gap?"{\n"+gap+partial.join(",\n"+gap)+"\n"+m'+
'ind+"}":"{"+partial.join(",")+"}";gap=mind;return v}}if(typeof JSON.stringify'+
'!=="function"){meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r","'+
'\"":"\\\"","\\":"\\\\"};JSON.stringify=function(value,replacer,space){var i;g'+
'ap="";indent="";if(typeof space==="number"){for(i=0;i<space;i+=1){indent+=" "'+
'}}else if(typeof space==="string"){indent=space}rep=replacer;if(replacer&&typ'+
'eof replacer!=="function"&&(typeof replacer!=="object"||typeof replacer.lengt'+
'h!=="number")){throw new Error("JSON.stringify");}return str("",{"":value})}}'+
'if(typeof JSON.parse!=="function"){JSON.parse=function(text,reviver){var j;fu'+
'nction walk(holder,key){var k;var v;var value=holder[key];if(value&&typeof va'+
'lue==="object"){for(k in value){if(Object.prototype.hasOwnProperty.call(value'+
',k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}ret'+
'urn reviver.call(holder,key,value)}text=String(text);rx_dangerous.lastIndex=0'+
';if(rx_dangerous.test(text)){text=text.replace(rx_dangerous,function(a){retur'+
'n("\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4))})}if(rx_one.test(tex'+
't.replace(rx_two,"@").replace(rx_three,"]").replace(rx_four,""))){j=eval("("+'+
'text+")");return(typeof reviver==="function")?walk({"":j},""):j}throw new Syn'+
'taxError("JSON.parse");}}}());function Json(){return JSON;} function aGet(Jso'+
'nArray, Index){return(JsonArray[Index]);}');
end;

function JSON:variant;
begin result:=ScriptEngine.Run('Json'); end;

function aGet(JsonArray:variant;Index:integer):variant;
begin result:=ScriptEngine.Run('aGet',JsonArray,Index); end;

procedure OnFinish(Sender:TObject);
var
  rj,Banks:variant;
  rs:string;
  HC:THttpClient;
  i:integer;
begin
  HC:=THttpClient(Sender);
  if HC.ResponseStatusCode<>200 then
  begin
    debug(HC.ResponseStatusCode);
    debug(HC.ResponseStatusText);
    exit;
  end;
  rs :=  HC.Content;
  try
    RJ := JSON.parse(rs);
    debug(
    RJ.Inn+#13#10+
    RJ.Kpp+#13#10+
    RJ.Opf+#13#10+
    RJ.FirmTaxation+#13#10+
    RJ.ShortName+#13#10+
    RJ.Name+#13#10+
    RJ.Address+#13#10+
    RJ.FioHead+#13#10+
    '')
    for i:=0 to RJ.Banks.length-1 do
    begin
      debug(i+1);
      debug(aGet(RJ.Banks,i).SettlementNumberId);
      debug(aGet(RJ.Banks,i).Number);
      debug(aGet(RJ.Banks,i).Name);
      debug(aGet(RJ.Banks,i).Bik);
      debug(aGet(RJ.Banks,i).Bik);
    end;
      debug(RJ.ElectronicReports);
      debug(RJ.IsStamp);
  except
    debug('JSON.parse:');
    debug(ExceptionParam);
  end;
end;

procedure OnError(Sender: TObject; const ErrorMsg: String);
begin
 debug(ErrorMsg)
end;

procedure  fpHttpRequest(Sender:TObject);
var HR:THttpClient;
begin
  try
    HR:=THttpClient.Create;
    HR.Async:=true;
    HR.OnFinish:=@OnFinish;
    HR.OnError:=@OnError;
    HR.Send('get','https://restapi.moedelo.org/requisites/GetFirmRequisites');
  except
    debug(ExceptionParam);
  finally
    HR.Free;
end;
end;

procedure Form_Create;
begin
  InitScriptEngine;
  dxButton1.OnClick:=@fpHttpRequest;
end;

procedure Form_Destroy;
begin
 ScriptEngine:=Unassigned;
end;

Обратил внимание, что ответ ускоряется, если прописать нужный заголовок Accept в запросе, но не думаю, что его отсутствие как то оправдывает подвисание формы, пока сервер "думает", что же отослать в ответ.
Пробовал также прописать Application.ProcessMessages сразу после вызова Send, форма не блокируется, но и код перестает работать выдавая 0 в исключении.
Фрилансер. Разработка на заказ. Консультирование.

Аватара пользователя
admin
Разработчик
Сообщения: 4630
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская
Благодарил (а): 20 раз
Поблагодарили: 95 раз

Re: Обсуждение релиза 3 beta (08.10.18)

Сообщение admin » Вт окт 16, 2018 11:26 am

В вашем случае после Send сразу выполняется метод Free, в котором ожидается завершение потока, поэтому приложение и подвисает. В вики есть пример работы с клиентом в асинхронном режиме.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1586
Зарегистрирован: Пн ноя 27, 2017 8:02 am
Поблагодарили: 9 раз

Re: Обсуждение релиза 3 beta (08.10.18)

Сообщение Гocть » Вт окт 16, 2018 12:15 pm

Насчет Free понял, спасибо. Из примера в вики не подходит создание клиента в Form_Create и его глобальное объявление. Буду придумывать способ как уничтожать его по завершению процедуры.

P.S. Попробовал пример из вики "как есть". Почему то повторный вызов Send переводит процедуру в синхронный режим.
Фрилансер. Разработка на заказ. Консультирование.

Аватара пользователя
admin
Разработчик
Сообщения: 4630
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская
Благодарил (а): 20 раз
Поблагодарили: 95 раз

Re: Обсуждение релиза 3 beta (08.10.18)

Сообщение admin » Пт окт 19, 2018 10:35 pm

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


Вернуться в «Обсуждение релизов DataExpress»