Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
zaman aşımı
#1
aşağıdaki koda nasıl zaman aşımı ekleyebilirim örneğin 10 sn sonra false olup internet yavaş uyarısı versin
function internetebaglimi(url:string):boolean;
var
hSession, hfile: hInternet;
dwindex,dwcodelen :dword;
dwcode:array[1..20] of char;
res : pchar;
begin
if pos('https://',lowercase(url))=0 then
url := 'https://'+url;
Result := false;
hSession := InternetOpen('InetURL:/1.0',
INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0);
if assigned(hsession) then
begin
hfile := InternetOpenUrl(
hsession,
pchar(url),
nil,
0,
INTERNET_FLAG_RELOAD,
0);
dwIndex := 0;
dwCodeLen := 10;
HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE,
@dwcode, dwcodeLen, dwIndex);
res := pchar(@dwcode);
result:= (res ='200') or (res ='302');
if assigned(hfile) then
InternetCloseHandle(hfile);
InternetCloseHandle(hsession);
end;
end;
Cevapla
#2
Sorunu izah ederseniz daha spesifik cevap verebiliriz.
Şöyle ki, bu kod TRUE döndüğü halde internet hızı yavaş olduğundan tepkisi mi uzun düşüyor ? O zaman PING süresini alan bir fonksiyon önerebiliriz.
Diğer yandan o an TRUE değeri dönüyor ama işlem yapma aşamasında bağlantı mı kopuyor ? O zaman ger bağlantı içi işlemden önce bu sorgunun yinelenmesini önerebiliriz.
Eğer ekranda sürekli bir Internet bağlantı sağlık monitörü gösterilecekse timer altında bu fonksiyonu defaten sorgulamak lazım şeklinde önereceğiz.

Yani sorunuzun nedenini söylerseniz hedefe yönelik çözüm sunmak açısından seçenek ne kadar bol onu bildirmek isteriz.

Diğer yandan bile isteye 10 saniye sonra internet yavaş uyarısı verdirmek mantığını oturtamadım. 10 saniye sonra bu sorguyu yapmadan FALSE gibi davranın isteğiniz yerine gelmiş olur keza...
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
(23-11-2022, Saat: 12:59)mrmarman Adlı Kullanıcıdan Alıntı: Sorunu izah ederseniz daha spesifik cevap verebiliriz.
Şöyle ki, bu kod TRUE döndüğü halde internet hızı yavaş olduğundan tepkisi mi uzun düşüyor ? O zaman PING süresini alan bir fonksiyon önerebiliriz.
Diğer yandan o an TRUE değeri dönüyor ama işlem yapma aşamasında bağlantı mı kopuyor ? O zaman ger bağlantı içi işlemden önce bu sorgunun yinelenmesini önerebiliriz.
Eğer ekranda sürekli bir Internet bağlantı sağlık monitörü gösterilecekse timer altında bu fonksiyonu defaten sorgulamak lazım şeklinde önereceğiz.

Yani sorunuzun nedenini söylerseniz hedefe yönelik çözüm sunmak açısından seçenek ne kadar bol onu bildirmek isteriz.

Diğer yandan bile isteye 10 saniye sonra internet yavaş uyarısı verdirmek mantığını oturtamadım. 10 saniye sonra bu sorguyu yapmadan FALSE gibi davranın isteğiniz yerine gelmiş olur keza...

Hocam şöyleki: programa giriş yapılınca netten aktivasyon kodunu ve program kullanım kalan süresini çektirip onaylatıyorum.. eğer internet yoksa localdaki aktivasyon ve süreyi sorgulatıyorum ve onaylatıyorum... bazen net yavaş olduğu zaman bekleme yapıyor .. bu bekleme sırasında ekran başındaki kişinin ne oluyor program niye açılmıyor dememesi için
örneğin 3 sn sonra true olmassa localdeki bilgileri sorgulatacam
Cevapla
#4
Bu durumda bir thread altına almak durumundasınız. Böylece sorgulamadan bağımsız bir yapı kurmuş olursunuz.

Siz dilediğiniz kadar bekler bekleme sonunda Global değişken içeriği neyse ona göre davranırsınız. 
Not: showmessage'lere takılmayın onları silebilirsiniz de, burada ne kadar erken geç onu test için ekledim. Siz projenizin içerisinde sadece bu ShowMessage yazan kısımdaki FIntAvail değişlenini soracaksınız. 
* Bekleyeceğiniz süre içerisinde Thread başarılı bitmişse sonuç internet bağlantısı TRUE/FALSE olacak, 
* Sorgu zamanı uzar da thread işini bitirmeden erkenden sorarsanız garanti size FALSE cevabı hazır olacaktır.
 
EK : unutmayın buradaki thread, paralel bir işlem yaptığından hemen aşağıda sorarsanız FALSE cevabı alabilirsiniz. Çünkü THREAD daha sorgusunu yapamadan sizin buton işlemi bir alt satıra 100 milisaniye içinde geçecektir. Size sunulan çözüm, işlem sürüyor olsa bile en fazla 3 saniye bekleme yapmak şeklinde. BU 3000 rakamını 1000 x saniye olarak değerlendirin. Çünkü değerler milisaniye cinsinden...

Örnek :
procedure TForm1.BitBtn2Click(Sender: TObject);
var
  LTimeOut : cardinal;
begin
  BitBtn1Click(BitBtn1);
  LTimeOut := GetTickCount + 3000; // şimdiden 3 saniye ötesine kadar
  while (LTimeOut > GetTickCount) and (NOT FIntAvail) do
  begin
    Application.ProcessMessages;
    Sleep(10);
  end;
  // şimdi internet sonucu ya gelmiştir ya da 3 saniye beklemiştir.
  if FIntAvail
    then Showmessage('OK')
    else Showmessage('FAIL');
end;




Ana projenizdeki yapı şu şekilde olabilir. ( google drive linki )
uses InternetCheckerU;
var
 FIntCheck : InternetCheckerU.tInternetChecker;
 FIntAvail : boolean;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 if Assigned( FIntCheck ) then
   exit;

 FIntAvail := false;
 FIntCheck := tInternetChecker.Create(true);
   FIntCheck.OnTerminate := FIntCheckTerminated;
   FIntCheck.OnState     := FIntState;
 sleep(100);
 FIntCheck.Start;
end;

procedure TForm1.FIntCheckTerminated(sender:TObject);
begin
 FIntCheck := nil;
end;

procedure TForm1.FIntState(sender:TObject);
begin
 FIntAvail := FIntCheck.IsInternetAvailable;
//  if FIntAvail
//    then Showmessage('OK')
//    else Showmessage('FAIL');
end;


bu da Thread içeren unit
unit InternetCheckerU;

interface

uses System.SysUtils, System.Classes, System.Types;

type tInternetChecker = class( TThread )
 private
 var
   FInternetAvail  : boolean;
   FOnState        : TNotifyEvent;
   function    CheckConnection(url: string): boolean;
 protected
   procedure   Execute; override;
 public
   constructor Create(CreateSuspended: Boolean);
   destructor  Destroy; override;
   property    IsInternetAvailable: boolean read FInternetAvail;
   property    OnState : TNotifyEvent read FOnState write FOnState;
end;

implementation

uses WinInet;

{ tInternetChecker }

function tInternetChecker.CheckConnection(url:string):boolean;
var
 hSession, hfile: hInternet;
 dwindex,dwcodelen :dword;
 dwcode:array[1..20] of char;
 res : pchar;
begin
 if pos('https://',lowercase(url))=0
   then
     url := 'https://'+url;

 Result    := false;
 hSession  := InternetOpen('InetURL:/1.0',
 INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0);

 if assigned(hsession) then
 begin
   hfile := InternetOpenUrl( hsession,
                             pchar(url),
                             nil,
                             0,
                             INTERNET_FLAG_RELOAD,
                             0 );
   dwIndex   := 0;
   dwCodeLen := 10;
   HttpQueryInfo(  hfile, HTTP_QUERY_STATUS_CODE,
                   @dwcode, dwcodeLen, dwIndex );
   res       := pchar(@dwcode);
   result    := (res ='200') or (res ='302');
   if assigned(hfile)
     then
       InternetCloseHandle(hfile);

   InternetCloseHandle(hsession);
 end;
end;

constructor tInternetChecker.Create(CreateSuspended: Boolean);
begin
 inherited Create(CreateSuspended);
 FInternetAvail        := false;
 Self.FreeOnTerminate  := True;
end;

destructor tInternetChecker.Destroy;
begin

 inherited;
end;

procedure tInternetChecker.Execute;
begin
 try
   FInternetAvail := CheckConnection( 'https://www.google.com');
   if Assigned(FOnState) then FOnState(self);

 except on E: Exception do
 end;
end;

end.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#5
tşkler bu işimi fazlasıyla gördü
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  TUBITAK Zaman Damgası ikurt07 11 924 28-01-2022, Saat: 10:56
Son Yorum: mkysoft
  Zaman aşımı kontrolü eskalibur_ 2 429 11-08-2021, Saat: 12:12
Son Yorum: eskalibur_
  TidHTTP zaman aşımı info@guzelceker.com 1 435 09-05-2021, Saat: 16:51
Son Yorum: savasabd
  while döngüsüne zaman verme Mete 2 773 02-05-2021, Saat: 13:21
Son Yorum: Mete
  "Sorgu Zaman Aşımı Doldu" Hatası OZCANK 7 1.745 08-11-2020, Saat: 10:17
Son Yorum: serdar



Konuyu Okuyanlar: 1 Ziyaretçi