Topic: Асинхронность

Асинхронный ввод-вывод—это форма обработки ввода/вывода, позволяющая продолжить обработку других задач, не ожидая завершения передачи.
 
подробное описание в нутри проекта..

Post's attachments

Attachment icon Asynchrony.7z 4.34 kb, 353 downloads since 2019-05-28 

Re: Асинхронность

Немного изменил ваш скрипт, таким образом не нужно ждать ответа жестко заданное время, вместо этого проверяем статус ответа 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.
Dmitry.