Topic: Асинхронность
Асинхронный ввод-вывод—это форма обработки ввода/вывода, позволяющая продолжить обработку других задач, не ожидая завершения передачи.
подробное описание в нутри проекта..
My Visual Database → FAQ → Асинхронность
Асинхронный ввод-вывод—это форма обработки ввода/вывода, позволяющая продолжить обработку других задач, не ожидая завершения передачи.
подробное описание в нутри проекта..
Немного изменил ваш скрипт, таким образом не нужно ждать ответа жестко заданное время, вместо этого проверяем статус ответа 10 раз в секунду, и как только он появился, выдаем его. Также можно задать таймаут, сейчас установлен в 3 секунды
{Глобальные переменные }
var
http: variant; // переменная обьекта асинхронности (вроди так правельно назвать)
url: string; { переменная содержащая адрес запроса
записать ее можно сразу так (url: string = 'https://service-vv.ru';) или передовать при вызове процедуры
зависит от Вашего желания}
Timer:TTimer; // таймер
i:integer = 30; // переменная содержащая колличество секунд таймаута запроса.. 30 - 3сек
// кнопка вызова процедуры асинхронного запроса..
procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
ReadResponse; // просто вызов процедуры
//ReadResponse('https://url/create_product.php','name=eve&price=23&description=тестирование'); //вызов процедуры с параметрами ( адрес запроса, параметры запроса)
end;
{процедура асинхронного запроса
все операции с запросами выполняются именно в этой процедуре если Вы исполизуете вызов процедуры с параметрами то
измените заголовок процедуры на - procedure ReadResponse (surl, ssend: string); где (адрес, параметры : string); соответственно
http.open('GET', url, true) и http.send() будут выглядеть как http.open('GET', surl, true) и http.send(ssend)}
procedure ReadResponse;
begin
url:='https://ya.ru'; // веб адрес, можно просто изменить на нужный Вам или получать его любвм другим способом
http:=createoleobject('WinHttp.WinHttpRequest.5.1'); // создаем leobject просто не трогайте (это всегда нужно)
http.open('GET', url, true); {открываем одрес для запроса где (тип запроса GET или POST, адрес запроса, асинхронность False или True)}
{SetRequestHeader - Это указание для сервера - как обрабатывать (раскодировать) пришедший запрос}
http.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
http.send(); // передает параметры запроса..
Timer.enabled:=True; //вызывает процедуру отчета таймаута..
end;
{процедура отчета времени.. отчитывает 3 секунды заложенных в глобальной переменной (i)
время можете менять по своему усмотрению просто измените значение (i:integer = 30;) в начале листинга
это нужно для того, что бы у процедуры было время для того, что бы получить ответ, если времени не
хватить вы также получите ошибку}
procedure outnum;
begin
// таймаут
Dec(i);
if i < 0 then
begin
form1.Memo1.Text:='Ответ неполучен!';
Timer.enabled:=False;
i := 30;
end;
//https://docs.microsoft.com/en-us/windows/desktop/winhttp/http-status-codes
// проверяем статус ответа, если ответа пока нету, это вызывает исключение, глушим его
try
if http.Status() = 200 then
begin
form1.Memo1.Text:=http.responsetext;
Timer.enabled:=False;
i := 30;
end;
except
end;
end;
procedure Form1_OnShow (Sender: TObject; Action: string);
begin
Timer := TTimer.create(form1);
Timer.enabled:=False;
Timer.ontimer:= @outnum;
Timer.Interval:=100;
end;
{процедура закрытия программы..}
procedure Form1_OnClose (Sender: TObject; Action: string);
begin
Timer.free;
end;
begin
end.
My Visual Database → FAQ → Асинхронность
Powered by PunBB, supported by Informer Technologies, Inc.
Theme Hydrogen by Kushi