Merhaba,
Daniele Spinetti, Yeniden Deneme Mekanizması konu başlıklı makalesinde işe yarar bir konuya değinmiş.
Uygulamalarda sık kullanılan bir olayın denenmesi veya tekrar edilmesi için kullanılabilecek bir yöntem.
Örneğin, internet veya lokal network bağlantısına ihtiyaç duyan bir uygulamanın, bağlantıyı gerçekleştirmek için sürekli bağlanma isteği oluşturması. (Bağlantı deneme sayısı ve her denemede bekleme süresi belirlenebiliyor)
Paylaşmış olduğu örnekte, küçük bir değişiklik yaparak; farklı işlerde kullanılabilecek kodu paylaşmak istiyorum.
Daniele Spinetti'nin örneğinde, yapılan işlemin hataya düşmesi (işlemin başarısız olması) durumunda, belirlenen sayıda işlemin tekrarlanması isteniyor.
Şimdi vereceğim örnekte ise; TTimer çalışma prensibine benzer bir tekrarlama mekanizması işletiliyor. Tek farkı prosedürel metodun dinamik olmasıdır.
Her TTimer nesnesi yalnızca bir metod (OnTimer) işletir. Bu yöntemle her prosedürünüzü bir TTimer'a dönüştürebilirsiniz.
Unit
Kullanımı
Daniele Spinetti, Yeniden Deneme Mekanizması konu başlıklı makalesinde işe yarar bir konuya değinmiş.
Uygulamalarda sık kullanılan bir olayın denenmesi veya tekrar edilmesi için kullanılabilecek bir yöntem.
Örneğin, internet veya lokal network bağlantısına ihtiyaç duyan bir uygulamanın, bağlantıyı gerçekleştirmek için sürekli bağlanma isteği oluşturması. (Bağlantı deneme sayısı ve her denemede bekleme süresi belirlenebiliyor)
Paylaşmış olduğu örnekte, küçük bir değişiklik yaparak; farklı işlerde kullanılabilecek kodu paylaşmak istiyorum.
Daniele Spinetti'nin örneğinde, yapılan işlemin hataya düşmesi (işlemin başarısız olması) durumunda, belirlenen sayıda işlemin tekrarlanması isteniyor.
Şimdi vereceğim örnekte ise; TTimer çalışma prensibine benzer bir tekrarlama mekanizması işletiliyor. Tek farkı prosedürel metodun dinamik olmasıdır.
Her TTimer nesnesi yalnızca bir metod (OnTimer) işletir. Bu yöntemle her prosedürünüzü bir TTimer'a dönüştürebilirsiniz.
Unit
unit RetryHelperU; interface uses System.SysUtils; type TRetryHelper = class(TObject) class procedure DoRetry(const ATimes: Integer; ADelayInMillis: Int64; AProc: TProc); end; implementation uses System.Classes; { TRetryer } class procedure TRetryHelper.DoRetry(const ATimes: Integer; ADelayInMillis: Int64; AProc: TProc); var LRetry: Integer; begin TThread.CreateAnonymousThread( procedure() begin LRetry := 0; while LRetry <= ATimes do begin Inc(LRetry); TThread.Queue(Nil, procedure begin AProc() end); if ADelayInMillis > 0 then TThread.Sleep(ADelayInMillis); end; end).Start; end; end.
Kullanımı
implementation {$R *.fmx} uses RetryHelperU; procedure TForm1.Button1Click(Sender: TObject); begin TRetryHelper.DoRetry(20, 750, procedure begin Form1.Edit2.Text := IntToStr(Edit2.Text.ToInteger + Edit1.Text.ToInteger); end); end;