Delphi - сбориник статей

       

Вызов WEB-методов. Асинхронный режим.


Ниже приведен код нашего клиентского приложения, умеющего выполнить WEB-метод, и отобразить результат: unit Umain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Borland.Vcl.StdCtrls, System.ComponentModel, localhost.WebService1; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Edit3: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private FWEBProxy:TWebService1; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.nfm} procedure TForm1.FormCreate(Sender: TObject); begin FWEBProxy:=TWebService1.Create; end; procedure TForm1.Button1Click(Sender: TObject); begin Edit3.Text:= IntToStr(FWEBProxy.Substract (StrToInt(Edit1.Text),StrToInt(Edit2.Text) )); end; end.


Рис 9. Веб калькулятор в действии

Теперь давайте усложним задачу? Заставим метод Substract возвращать результат через определенное время? В этом случае наше клиентское приложение попросту будет "висеть" пока WEB-метод не отработает. Давай добавим в WEB-метод Substract нашего WEB-сервиса имитацию бурной деятельности:

function TWebService1.Substract(a,b:Integer):Integer; var i:Integer; begin Sleep(5000); Result := a - b; end;

Так вот теперь, если запустить наш калькулятор, он будет успешно зависать на почти пять секунд. Возможно, нам нужно выполнять программу дальше, даже если результат WEB-метода еще не получен? Для этого существует возможность вызвать метод асинхронно.

Обратите внимание на то что в описании интерфейса прокси класса есть методы Begin<имя WEB-метод> и End<WEB-метод>, например BeginSubstract, EndSubstract. Схема их использования примерно таковы:

  1. BeginSubstract, EndSubstract procedure TForm1.Button1Click(Sender: TObject); var asyncres:IAsyncResult; begin asyncres:=FWEBProxy.BeginSubstract (StrToInt(Edit1.Text), StrToInt(Edit2.Text),nil,nil); // какой-то код Edit3.Text:= IntToStr(FWEBProxy.EndSubstract (asyncres)); end;

Это означает, что метод BeginSubstract инициирует выполнение WEB-метода, но при этом не останавливает выполнение основного приложения. В момент вызова EndSubstract завершается выполнение WEB-метода. Если последний еще не отработал - клиентское приложение блокируется до завершения работы метода.

  • Использование свойства IsCompleted интерфейса IAsyncResult. procedure TForm1.Button1Click(Sender: TObject); var asyncres:IAsyncResult; begin asyncres:=FWEBProxy.BeginSubstract (StrToInt(Edit1.Text), StrToInt(Edit2.Text),nil,nil); while not asyncres.IsCompleted do Application.ProcessMessages; Edit3.Text:= IntToStr(FWEBProxy.EndSubstract (asyncres)); end;
  • Подписка за событие о завершении асинхронного вызова. unit Umain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Borland.Vcl.StdCtrls, System.ComponentModel, localhost.WebService1; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Edit3: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private FWEBProxy:TWebService1; procedure SubstratctFinished (Res:IAsyncResult); { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.nfm} procedure TForm1.FormCreate(Sender: TObject); begin FWEBProxy:=TWebService1.Create; end; procedure TForm1.Button1Click(Sender: TObject); begin FWEBProxy.BeginSubstract(StrToInt(Edit1.Text), StrToInt(Edit2.Text), SubstratctFinished,nil); end; procedure TForm1.SubstratctFinished (Res: IAsyncResult); begin Edit3.Text:= IntToStr (FWEBProxy.EndSubstract(Res)); end; end.


  • Содержание раздела