Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Timer stringlist
#1
Merhaba, 

Databasede resimlerin bulunduğu klasörün yolu var. Bu resimleri 5 ile 10 saniye aralıklarda TImage de değiştireceğim.
Fakat sıkıntı şu her 5 veya 10 saniyede databaseden resim yolunu almak istediğimde programda donma gibi durumlar çıkacak.
Bu durumu yaşamakam için stringlist ile databaseden veri bilgilerini bir seferde alıp listelemek bana daha mantıklı geldi.

Fakat Timer kullanarak stringliste bir sonraki veriye nasıl geçebilirim? ve en sondaki veriyi aldıktan sonra ilk sıraya nasıl dönebilirim?
Cevapla
#2
bence bu ise bir thread ile yapman daha dpoğru olur
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#3
(23-02-2018, Saat: 22:19)dilo Adlı Kullanıcıdan Alıntı: Merhaba, 

Databasede resimlerin bulunduğu klasörün yolu var. Bu resimleri 5 ile 10 saniye aralıklarda TImage de değiştireceğim.
Fakat sıkıntı şu her 5 veya 10 saniyede databaseden resim yolunu almak istediğimde programda donma gibi durumlar çıkacak.
Bu durumu yaşamakam için stringlist ile databaseden veri bilgilerini bir seferde alıp listelemek bana daha mantıklı geldi.

Fakat Timer kullanarak stringliste bir sonraki veriye nasıl geçebilirim? ve en sondaki veriyi aldıktan sonra ilk sıraya nasıl dönebilirim?

Merhaba,


Böyle bir durumda kasma veya donmanın olmaması için bir thread açmak mantıklı olacaktır. Tabi eğer sistem üzerinde pek bellek harcamak istemiyorsanız sizin dediğiniz yöntemde olabilir. Thread mantığı konusunda iki türlü çözümünüz mevcut. Biri "TThread.CreateAnonymousThread". Bir diğeri ise "PPL yöntemi. PPL yöntemi ile bir işlem(ITask)" oluşturarak yine aynı şekilde işleminizi arka planda halledebilirsiniz. 

TThread.CreateAnonymousThread Kullanımı;

Procedure....
begin

TThread.CreateAnonymousThread(procedure()
  begin
    Kodlarınız....
  end).Start;

end;

Eğer ITask ile işlem yapmak isterseniz; 

  Exclamation İlk olarak kütüphanenize "System.Threading" kütüphanesini eklemeyi unutmayınız.

Procedure....
var
 ATask: ITask;
begin

  ATask := TTask.Create(Procedure()
  begin
    kodlarınız...
  end);

  ATask.Start;

end;

Eğer Timer ile TStringList ile dediğiniz gibi bir işlem yapmak istiyorsanız bunu timer ve döngüler ile işleminizi gerçekleştirebilirsiniz..


İşinize yarayabilecek kaynaklar;

Döngüler
PPL Yapısı (Bu kıymetli eserin çevirisini yaptıkları için tekrardan uparlayan ve savasabd üstatlara teşekkürler)


Saygılarımla,
İyi çalışmalar.
kisisel_logo_dark.png
WWW
Cevapla
#4
Merhaba, 


Thread başım belada, yaklaşık onlarca test yaptım Thread kullanmadığımda verileri alabiliyorum.
Kodlara Thread entegre ettiğimde ise 10 denemede belki bir sefer sonuçu alabiliyorum, acaba kodlamada mı sıkıntı var?

procedure TForm2.Button1Click(Sender: TObject);
begin
  With YeniIlan do
  begin
    TThread.CreateAnonymousThread(
      procedure()
      begin
        Close;
        SQL.Clear;
        SQL.Add('Select * From ILAN Where ID=:ID');
        ParamByName('ID').AsInteger := 4;
        Open;
        if Not IsEmpty then
        begin
          LabelLeft.Text := FieldByName('SAYISI').AsString + ' ' +
            FieldByName('DURUM').AsString + ' ' + FieldByName('FIYAT').AsString;
        end;
      end).Start;
  end;
end;
Cevapla
#5
Merhaba.

Thread yapındaki hata Query nesneni ana omurgadan alıyor olmanda.  Şöyle düşün nesne meşgulken bir başka thread aynı Query'e başvurunca ne yapsın zavallı. :Smilehread için de TQuery create edersen sorun kalmaz. 
 
İlk fikrin güzeldi bence. Zaten resmi gösteriyorken geçen süre kadar bekleme olmayacak mı ? Eğer resimleri gösterirken kullanıcının başka işlem yapmasına ilişkin donma diyorsan o başka ki network kablonu çekip geri takarak incele, ne tür bir donmadan bahsediyoruz bilemedim. 

Donma dediğin aslında resmi (1-2) saniye fazla göstermeden öte değil mi ? Baktın SQLQuery timeout'a düştü çalıştığım kurum TRT'den nostallji yapayım NECEFLİ MAŞRAPA

neceflimasrapa.jpg

Şaka şaka.. ama her şakada bir gerçek payı vardır. Resimlere ulaşırken timeout olursa yedekte bulundurduğun resmi sunarsın. 
Zaten ağda bir sorun olursa thread de olsa listeye ekleme yapamayacağını unutmamak lazım.

Başarılar.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#6
(26-02-2018, Saat: 20:06)dilo Adlı Kullanıcıdan Alıntı: Merhaba, 


Thread başım belada, yaklaşık onlarca test yaptım Thread kullanmadığımda verileri alabiliyorum.
Kodlara Thread entegre ettiğimde ise 10 denemede belki bir sefer sonuçu alabiliyorum, acaba kodlamada mı sıkıntı var?

procedure TForm2.Button1Click(Sender: TObject);
begin
  With YeniIlan do
  begin
    TThread.CreateAnonymousThread(
      procedure()
      begin
        Close;
        SQL.Clear;
        SQL.Add('Select * From ILAN Where ID=:ID');
        ParamByName('ID').AsInteger := 4;
        Open;
        if Not IsEmpty then
        begin
          LabelLeft.Text := FieldByName('SAYISI').AsString + ' ' +
            FieldByName('DURUM').AsString + ' ' + FieldByName('FIYAT').AsString;
        end;
      end).Start;
  end;
end;

Merhaba,

mrmarman'ın yazdıkları doğru ama eksik. Query nesnesini ana formdan kullanmanız yanlış, ama aynı zamanda bu Query nesnesinin Connection nesnesinin de ana formda olması doğru değil. Neredeyse hiçbir connection nesnesi thread-safe değildir. Yani birden fazla thread arasında bir connection nesnesini paylaştıramazsınız. Bu yüzden "her thread için bir connection" diye düşünmek en güvenlisidir.

Bir de LabelLeft.Text := '...' kısmında sorun var. VCL bileşenleri de thread safe değildir. Eğer thread içinde bir VCL bileşenine ulaşacaksanız en basitinden synchronize methodu ile çağırmalısınız. Tabii ana thread ile farklı iletişim yöntemleri de olabilir, ama ilk akla gelen synchronize yöntemidir. Aksi takdirde ne zaman ve nasıl olduğunu bilmediğiniz hata mesajları alırsınız ve bu hata mesajlarını re-produce edemezsiniz, yani istediğiniz zaman tekrar tekrar üretemezsiniz. Dolayısıyla da sorunun nerede olduğunu tespit edemezsiniz (tabii en başta doğru yazmazsanız).

Son olarak with komutunu kullanmanızı tavsiye etmiyorum. Kodu okumayı ve debug etmeyi inanılmaz derecede zorlaştırıyor. Size kazandırdığı ise (yukarıdaki koda göre) sadece YeniIlan. yazısı ki bunu da kopyalayın ve yazmanız gerektiğinde yapıştırın. Forumda daha önce de bu konuda tavsiyede bulunmuştum ama gördüğüm kadarıyla pek önemsenmedi. Umarım siz bu tavsiyemi ciddiye alırsınız.

İyi çalışmalar
Cevapla
#7
(26-02-2018, Saat: 20:06)dilo Adlı Kullanıcıdan Alıntı: Merhaba, 


Thread başım belada, yaklaşık onlarca test yaptım Thread kullanmadığımda verileri alabiliyorum.
Kodlara Thread entegre ettiğimde ise 10 denemede belki bir sefer sonuçu alabiliyorum, acaba kodlamada mı sıkıntı var?

procedure TForm2.Button1Click(Sender: TObject);
begin
  With YeniIlan do
  begin
    TThread.CreateAnonymousThread(
      procedure()
      begin
        Close;
        SQL.Clear;
        SQL.Add('Select * From ILAN Where ID=:ID');
        ParamByName('ID').AsInteger := 4;
        Open;
        if Not IsEmpty then
        begin
          LabelLeft.Text := FieldByName('SAYISI').AsString + ' ' +
            FieldByName('DURUM').AsString + ' ' + FieldByName('FIYAT').AsString;
        end;
      end).Start;
  end;
end;

Merhaba,

@mrmarman ve @Bahadir.Alkac üstatların dediği gibi olay aslında. Siz thread kullanmadığınızda sadece bir işlem bir kanaldan devam etmekte ve sorun yaşamamaktasınız. Thread olayını daha sağlıklı yapmanız için, PPL kütüphanesini nasıl kullanmanız gerektiği konularını barından PPL Türkçe çevirisi(Yukarıda mesajımda link mevcut.) kitapçığı incelemenizi tavsiye ederim.

Saygılarımla,
İyi çalışmalar.
kisisel_logo_dark.png
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Timer Interval değerini verme - Çözüldü Altıner 1 862 31-03-2022, Saat: 22:47
Son Yorum: barutali
  FMX Timer Kullanım 3ddark 1 1.662 25-04-2020, Saat: 17:24
Son Yorum: Abdullah ILGAZ
  Timer -Procedure ? Mr.Developer 9 6.747 23-05-2019, Saat: 17:32
Son Yorum: Mr.Developer
  bileşen - timer vs kalabalığıdan kurtulma ? Mr.Developer 13 9.293 18-07-2018, Saat: 15:35
Son Yorum: Mr.Developer



Konuyu Okuyanlar: 1 Ziyaretçi