İnternet Kontrolü - Donma

FireMonkey ve Mobil uygulama (iOS, Android, Windows Phone) ile ilgili sorularınızı bu foruma sorabilirsiniz.
Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 02:09
Konum: Azerbaycan, Bakü
İletişim:

İnternet Kontrolü - Donma

Mesaj gönderen AliZairov » 24 Tem 2014 01:26

İyi sabahlar. Yaptığım küçük uygulama için İnternet Kontrolü yapmak istiyorum amma donma oluyor. Şöyle ki, Tİmer ile denetliyorum her 1 saniyede 1 test ediyor. Amma nedense internet kapadığımda ya açtığımda uygulama yanıt vermiyo donup kalıyor. Thread nedense çalışmıyor. Uygulama gelip gidiyor.

Kod: Tümünü seç

unit NetTimer;

interface

uses
  System.Classes, NetworkState;

type
  TNetTimer = class(TThread)
  private
    FNS: TNetworkState;
  protected
    procedure Command;
  public
    StartTickCount, Delay: Cardinal;
    procedure Execute; override;
  end;

implementation

{ TNetTimer }

uses uMain;

procedure TNetTimer.Command;
begin
  FNS := TNetworkState.Create;
  if not FNS.IsConnected then
  begin
    Main.Name.Text := 'off';
  end else
  begin
    Main.Name.Text := 'on';
  end;
end;

procedure TNetTimer.Execute;
var
  C: Cardinal;
begin
  StartTickCount := GetTickCount;
  repeat
    C := GetTickCount;
    if StartTickCount + Delay >= C then
    begin
      Command;
      StartTickCount := C;
    end;
  until False;
end;

end.

procedure TMain.FormCreate(Sender: TObject);
var
  NT: TNetTimer;
begin
  NT := TNetTimer.Create;
  NT.Delay := 1000;
  NT.Execute;
end;

En son AliZairov tarafından 24 Tem 2014 08:16 tarihinde düzenlendi, toplamda 1 kere düzenlendi.

Kullanıcı avatarı
codder71
Üye
Mesajlar: 117
Kayıt: 10 Tem 2010 06:41

Re: İnternet Kontrolü - Donma

Mesaj gönderen codder71 » 24 Tem 2014 06:29

Döngü kısmına su kodu yazıp denediniz mi acaba ?

Kod: Tümünü seç

application.processmessages;

Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 02:09
Konum: Azerbaycan, Bakü
İletişim:

Re: İnternet Kontrolü - Donma

Mesaj gönderen AliZairov » 24 Tem 2014 08:15

Iyi akşamlar. Teşekkürler. Amma malesef ondan diğil. Sorun qaliba Execcute prosedurunda. Qaliba bir hata yaptım. Bulmaya çalışıyorum.

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4717
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: İnternet Kontrolü - Donma

Mesaj gönderen mrmarman » 25 Tem 2014 12:40

Kod: Tümünü seç

procedure TNetTimer.Execute;
var
  C: Cardinal;
begin
  StartTickCount := GetTickCount;
  repeat
    C := GetTickCount;
    if StartTickCount + Delay >= C then
    begin
      Command;
      StartTickCount := C;
    end;
  until False;
end;
- Beraber TRACE edelim.
- EXECUTE edince ilk değer olarak StartTickCount := GetTickCount; demişsin. Bu iyi birşey. Her değişkenin bir ilk değer alması gerekir. Daha büyüktür ama örneğimizde (1000) rakamı diyelim.

- Delay değerin de (1000) olduğunu aklımıza not edelim.

- Şimdi bir REPEAT UNTIL sonsuz döngün var. Bu döngü içerisinde IF ile neyi sormuşsun ? if StartTickCount + Delay >= C then Şimdi 1000 + 1000 = 2000 daima şimdiki değerden büyük olacak değil mi. O zaman da her defasında Command procedure çalışacak o da yeni bir TNetworkState.Create; yükü demek.

- Özetle IF sorgun çalışmıyor.
Resim Resim

Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: İnternet Kontrolü - Donma

Mesaj gönderen warder » 25 Tem 2014 09:52

Hocam ona bende takıldım. Sizin gibi bir yanıt ta yazdım ama göndermeden bir kez daha inceleyince mantık hatası olmadığını farkettim.
Sadece delay süresi kadar yani 100 ms de o if gerçekleşiyor. +delay işi kurtarıyor. StartTickCount GetTickcount + delay kadar önde değerleniyor. GetTickcount onu yakalayınca if gerçekleşiyor.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4717
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: İnternet Kontrolü - Donma

Mesaj gönderen mrmarman » 25 Tem 2014 09:54

100 ms. bile yavaş kalmış. Normalde 1-5 milisaniyede girmesi lazımdı. Sisteminde başka yavaşlamalar da var demektir.
Hadi dediğin gibi olsun, dikkat edersen delay (1000) yani (1) saniye Bu da demek oluyor ki (1000/100 = 10) defa burayı çalıştırıyor.

Akıl var mantık var :

(1) Henüz bir satır önce StartTickCount ve C'yi yaklaşık aynı değer olan GetTickCount'a eşitliyorsunuz.
(2) Sonraki hemen alt satırda C değerinin Delay + StartTickCount'dan küçük olup olmadığını soruyorsunuz. Tabii ki küçük olacak bu da tak diye IF'in içerisine düşürür sizi.
(3) IF içerisinde de hemen StartTickCount'u yine GetTickCount ile eşitleyip aynı döngüyü aynı açık il aleyhinize yineliyorsunuz.

Bir kağıt kalem alın, "bullet time" denen şekilde zamanın bir anına ilişkin bu değişkenlere kafanızdan değer verin. TRACE edin.
Resim Resim

Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: İnternet Kontrolü - Donma

Mesaj gönderen warder » 25 Tem 2014 12:30

ilk mesajda o delay dün benim baktığımda 100 dü :) problem sahibi değiştirmiş.
Başka neler değiştirdi acaba...
Aşağıda ne yazarsan yaz. Yukarıdan soruyu bile değiştirebilir. Aşağıdaki yardımsever ne duruma düşer bilemem :)

Sonuçta haklısınız.. Şu anki görünüme göre (o if içinde dünkü mantık denetimini hatırlamıyorum.) hemen kontrol edildiği için StartTickCount + Delay .. GetTickCount değerinden her türlü büyük olacağından program akışı doğrudan içeri girecektir.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...

Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 02:09
Konum: Azerbaycan, Bakü
İletişim:

Re: İnternet Kontrolü - Donma

Mesaj gönderen AliZairov » 25 Tem 2014 02:23

Merhaba. Teşekkürler. Evet yazım hatalarından dolayı bir kaç kelimeni değiştirdim kodda. Amma o kodu tam olarak ben yazmadım sadece kendi yazılımıma uygun düzenledim. Sorunu çözemediğimden o usesi kaldırdım normal kontröl ile internet varsa yap şunu diyerek işlevi gerçekleştirdim. Proje radyo dinleme projesi o yüzden her kanala tıkladığımda onu denetliyorum varsa bağlanıyor.

Kullandığım makele bu. viewtopic.php?f=2&t=21745&p=124062&hili ... er#p124062

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4717
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: İnternet Kontrolü - Donma

Mesaj gönderen mrmarman » 26 Tem 2014 01:42

Thread işi sihirli bir iştir, 3 boyutlu düşünmek ister..
Önce sorgulama kısmının doğru çalıştığını test etmezsen böyle hayal kırıklılıkları ile karşılaşırsın.

(*) Öncelikle NETWORK sorgulama işini bir yap. Ondan sonra bunu küçük bir düzenleme ile THREAD içine koyarsın.

- Bir Function yaz. Online olup olmadığını TRUE veya FALSE olarak döndürsün.

- Sınıf yazmış olmak için sınıf yazılmaz. İhtiyacın yoksa bundan uzak dur. Ne zaman ihtiyaç olur, VCL hazırladığın zaman vb. durumlarda, son kullanıcıya kod kalabalığı yapmamak ve/veya sana özel kod yapısını paylaşmak istemediğin zaman sınıf yazar derler paketler verirsin.

- Burada Thread içerisinde kullanmak üzere sınıf yazıp CREATE ediyorsun, bir de bunu sonsuz döngü içerisinde yapıyorsun. Bunlardan uzak dur. FREE / ASSIGNED ihmallerin sebebiyle MemoryLeak ile hafızanda bu proje hafızada sürekli şişecektir. Free/Nil/Unassigned işlerini de ihmal etmişsin çünkü.

- Bilgi birikimini oluşturana kadar, yani bilerek yaptığın zaman kadar Thread içinde bu create işlerinden uzak durmalısın.

- Ayrıca başka bir fikrimi paylaşayım:

(*) Zaten her linke tıkladığında Internet kontrolü yapmak için bir yere PING atıyorsundur.
(*) Bunu iligili radyo linkine yaparsan thread'e ihtiyaç kalmadan bir taşla iki kuş vurmuş olursun.
(*) Mobil projelerde internet her an var olamaz. Şebeke sürekli değişkendir. Sen Ping atarsın o anlık internet var olur, tam sorgu yaparken yok olur. İki defa bunu yapmana bence lüzum yok. Basit bit TRY EXCPEPT bloğu işini görecektir.
Resim Resim

Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 02:09
Konum: Azerbaycan, Bakü
İletişim:

Re: İnternet Kontrolü - Donma

Mesaj gönderen AliZairov » 26 Tem 2014 02:07

Merhaba Muharrem abi. Teşekkürler. Projemi hazırladım. İntenet kontrölü için if kullandım şöyle yaptım bazı işlemlerde.

Kod: Tümünü seç

function Network: Boolean;
var
  NS: TNetworkState;
begin
  NS := TNetworkState.Create;
  try
    if not NS.IsConnected then
      Result := False else
        Result := True;
  finally
    NS.Free;
  end;
end;
Böyle birfunction yazdım. Gerekli yerlerde internet açık olmadığını anlıyorum. Amma ping olayını yapmadım.

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4717
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: İnternet Kontrolü - Donma

Mesaj gönderen mrmarman » 26 Tem 2014 02:39

Ping sadece bir öngörü idi. Neyle nasıl yaptığını bilmediğimden, internet kontrolünü yapma tekniklerinden biridir.

Aşağıda senin kodların üzerinde hazırladığım bir örnek veriyorum. İncele ve sonucu bildir..

Altını çizmek istediğim noktalar var .

(1) Command işi bitene kadar yeniden çalışmasın diye xIslemYapiliyor isimli bir boolean değişken kullandık. Bu TRUE olduğu sürece yeniden yeniden çalışmaz.
(2) IF sorgunu da C >= StartTickCount + Delay şeklinde yönünü değiştirdim.

(*) Yine de önerim bunu THREAD içinde sürekli sorgulamak yerine kullanıcı lazım olduğunda linke her tıkladığında kontrol etmen. Böylece sistem güç tüketimine de zararın dokunmaz. Çünkü thread demek işlemci kullanımı demektir.

Kod: Tümünü seç

type
  TNetTimer = class(TThread)
  private
    xIslemYapiliyor : Boolean;
    function Network: Boolean;
  protected
    procedure Command;
  public
    StartTickCount, Delay: Cardinal;
    procedure Execute; override;
  end;

Kod: Tümünü seç

{ TNetTimer }

procedure TNetTimer.Command;
begin
  if not Network then
  begin
    Main.Name.Text := 'off';
  end else
  begin
    Main.Name.Text := 'on';
  end;
end;

Kod: Tümünü seç

procedure TNetTimer.Execute;
var
  C: Cardinal;
begin
  xIslemYapiliyor := False;
  StartTickCount  := GetTickCount;
  repeat
    C := GetTickCount;
    if (NOT xIslemYapiliyor) AND (C >= StartTickCount + Delay) then
    begin
      xIslemYapiliyor := True;
        StartTickCount := C;
        Command;
      xIslemYapiliyor := False;
    end;
  until False;
end;

Kod: Tümünü seç

function TNetTimer.Network: Boolean;
var
  NS: TNetworkState;
begin
  NS := TNetworkState.Create;
  try
    if not NS.IsConnected then
      Result := False else
        Result := True;
  finally
    NS.Free;
  end;
end;
Resim Resim

Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 02:09
Konum: Azerbaycan, Bakü
İletişim:

Re: İnternet Kontrolü - Donma

Mesaj gönderen AliZairov » 26 Tem 2014 03:45

Teşekkürler Muhharem abi. İnterneti kendi android apisi ile denetliyorum. Küçük bir örnek hazırlamıştım ekde paylaşıyorum. Orda timer kullandım sorun olmuyordu. Amma benim projede baya donma oluyordu. Ben timerin yapacağı işi thread ile yapmak istiyordum. Aynı işlev ediyorsa timer gibi thread hiç kullanmayım daha iyi. Yinede deneyeceğim. Tekrar teşekkürler.
Dosya ekleri
NetworkTest.zip
(61.13 KiB) 35 kere indirildi

Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 02:09
Konum: Azerbaycan, Bakü
İletişim:

Re: İnternet Kontrolü - Donma

Mesaj gönderen AliZairov » 26 Tem 2014 05:24

Tekrar Merhaba. Muharrem abi denedim malesef yine aynı. Siyah olarak donup kalıyo. Yinede elinize sağlık. Teşekkürler.

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4717
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: İnternet Kontrolü - Donma

Mesaj gönderen mrmarman » 26 Tem 2014 05:27

Canın sağolsun.

Yine önerimi tekrarlıyorum.
mrmarman yazdı: (*) Yine de önerim bunu THREAD içinde sürekli sorgulamak yerine kullanıcı lazım olduğunda linke her tıkladığında kontrol etmen. Böylece sistem güç tüketimine de zararın dokunmaz. Çünkü thread demek işlemci kullanımı demektir.
Resim Resim

Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 02:09
Konum: Azerbaycan, Bakü
İletişim:

Re: İnternet Kontrolü - Donma

Mesaj gönderen AliZairov » 26 Tem 2014 05:44

Dediğiniz gibi yaptım Muharrem abi. Tekrar teşekkürler.

Cevapla