Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Application.ProcessMessages'ın android karşılığı nedir?
#1
Application.ProcessMessages'ın androiddeki karşılığı nedir?
Eski sürümlerde androidde de çalışıyordu. Delphi 11'de çalışmaz olmuş. Yerine ne kullanabiliriz?
Cevapla
#2
Thread kullanmaniz gerekiyor hocam. Pc basina gecince kullanimini yazarim.
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#3
(20-02-2022, Saat: 00:15)mcuyan Adlı Kullanıcıdan Alıntı: Thread kullanmaniz gerekiyor hocam.  Pc basina gecince kullanimini yazarim.

Fonksiyon içinde bu şekilde bir thread kullanıyorum ama yanlış yerde yanlış bir kullanım mı emin değilim...

Function TFirsatForm.yorum(URLLER,anaba,anabi,linkba,linkbi : string) : string;
const
NONE              = $00; //Zero-value number
INET_USERAGENT    = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36';
INET_REDIRECT_MAX = 10;
var
 StreamData,resimstream,streamdataurun :TMemoryStream;
 i,ks,denemes,denemes1 :integer ;
 tmpstr,strGecici,strIcerik,strAra,strsecilen,urungecici,urunara : String;
 Bilgi   : TBilgi;
 jpg: TBitmap;
begin
   TThread.Synchronize(nil,
   procedure
   begin
     sayfa := URLLER ;
     Url := sayfa;
     StreamData := TMemoryStream.Create;
     Tex1 := TText.Create(Nil);
     Tex2 := TText.Create(Nil);
     TrackB := TTrackBar.Create(Self);
     TrackB.Max := 360;
     iSayac := 0;
     try
       try
        html:= NetHTTPClient1.Get(degis(sayfa)).ContentAsString;
        NetHTTPClient1.Get(degis(sayfa), StreamData);
        StreamData.Seek(0,soFromBeginning);
        Tex1.Text := degis(html);
        ks := 0;
       Except On E : Exception Do
   //     MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
       End;
     finally
       StreamData.free;
     end;
       tmpstr := Tex1.Text;
       strsecilen := aradansec(html, anaba ,anabi);// '<li class="column">','Öne Çıkan Sayfalar');

       strGecici := tmpstr;
       strAra := anaba;// '<li class="column">';
       while Pos(strAra, strGecici) > 0 do
       begin
         System.Delete( strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
         inc(iSayac);
       end;

     while Pos(anaba, strsecilen) > 0 do
     begin
   //    Application.ProcessMessages;
       inc(iSayac);
   //    if Progress <> nil then Progress.Value := iSayac;

       strAra := anaba;
       System.Delete( strsecilen, 1, Pos(strAra, strsecilen) + Length(strAra)-1 );
       strAra := anaba;

       // strBlok içerisinde bir başlık ve bilgileri olacaktır...
       strBlok := Copy(strsecilen, 1, Pos( strAra, strsecilen ) + Length(strAra)-1 );

       strAra := linkba ;
       if Pos( strAra, strBlok ) > 0 then
       begin
         strGecici := strBlok;
         System.Delete(strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
         link := Trim(Copy(strGecici, 1, Pos(linkbi, strGecici)-1 ));

         ekslink := aradansec(URLLER, 'https://','/');
         linkmidir(link);
         if linkmidir(link) = False then link := 'https://' + ekslink + link else link := link;
         streamdataurun := TMemoryStream.Create;
         try
           try
              htmlurun := '';
              htmlurun:= NetHTTPClient2.Get(link).ContentAsString;
              NetHTTPClient2.Get(link, StreamDataurun);
              StreamDataurun.Seek(0,soFromBeginning);
              tex2.Text := degis(htmlurun);
              ks := 0;
              urunGecici := tex2.Text;
              delete(urunGecici,1, Pos(urunic,urunGecici));

              siteisim := aradansec(URLLER, 'https://www.','.com/');

              ad := aradansec(urunGecici,adba,adbi);
              resim := aradansec(urunGecici,reba,rebi);
              resimdata := resimgoster(resim);
              fiyatstr := StringReplace(aradansec(urunGecici,fiba,fibi),'.','',[rfReplaceAll]);
              fiyat :=  strtofloat(fiyatstr);
              indirim := strtofloat(StringReplace(aradansec(urunGecici,inba,inbi),'.',',',[rfReplaceAll]));
              yuzdelik := hesapla(fiyat,indirim);
              if fiyatstr <> '0' then datayaekle(listview1);
              TrackB.Value := TrackB.Value + (100 / iSayac);
              pie1.EndAngle := TrackB.Value * 360 / 100;
              text1.Text := floattostr(TrackB.Value);
           Except On E : Exception Do
   //           showmessage('Exception: '+E.Message);
           End;
           finally
             StreamDataurun.free;
           end;
       end;
      end;
   end);
end;
Cevapla
#4
Ben şu şekilde Kullanıyorum.


TThread.CreateAnonymousThread(
   procedure()
   begin
     TThread.Synchronize(TThread.CurrentThread,
       procedure()
       begin
      // İşlemler
       end);


   end).Start;


Mobillerin çalışma prnesibi Windows gibi değildir. Windows da bi işlem bitmeden diğerine geçmez.. Bu nedenle işlem uzun ise application.Processmessage ile kilitlenmeyi donmeyıönleriz.

Fakat mobillerde durum böyle değildir. 
O kod cpu ya gönderiliriz.. Bitmesi beklemden diğer koda geçilir..

Eğer bitmesini beklemek istiyorsanız yukarıdaki thread'ı kullanmanız gerekiyor.
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#5
(22-02-2022, Saat: 17:52)mcuyan Adlı Kullanıcıdan Alıntı: Ben şu şekilde Kullanıyorum.


TThread.CreateAnonymousThread(
   procedure()
   begin
     TThread.Synchronize(TThread.CurrentThread,
       procedure()
       begin
      // İşlemler
       end);


   end).Start;


Mobillerin çalışma prnesibi Windows gibi değildir. Windows da bi işlem bitmeden diğerine geçmez.. Bu nedenle işlem uzun ise application.Processmessage ile kilitlenmeyi donmeyıönleriz.

Fakat mobillerde durum böyle değildir. 
O kod cpu ya gönderiliriz.. Bitmesi beklemden diğer koda geçilir..

Eğer bitmesini beklemek istiyorsanız yukarıdaki thread'ı kullanmanız gerekiyor.

Merhaba,

Maalesef açıklamalar doğru değil. Windows gibi diğer işletim sistemleri de bütün işlemleri sırayla yapar ve bir işlem bitmeden diğerine geçmez. Burada kafa karıştıran Anroid işletim sistemlerinde formların non-blocking olmasıdır. Yani ShowModal diye bir kavram yoktur. Bu yüzden de kodun tasarımının Windows ve iOS'dan farklı olması gerekiyor. Örneğin Android'de, Windows'daki gibi tipik bir giriş ekranı yapmak daha karmaşık, çünkü Kullanıcı Girişi penceresini ShowModal ile açamıyorsunuz ve kodunuz akıp gidiyor. Oysa Windows ve iOS'da ShowModal ile formu gösterdiğinizde blocking çalıştığı için pencere kapanana kadar kodunuz bekliyor. Buraya kadar bahsettiklerimizin de, dikkat ederseniz, Application.ProcessMessages ile ilgisi yok.

Peki Application.ProcesssMessages ne işe yarıyor? Çok basit. Windows'un uygulamalarla haberleşme yöntemi, pencerelere (aslında Handle'i olan bütün UI nesnelerine ve Handle'i olan gizli pencerelere) mesaj göndermektir. Örneğin "Fare pencereye girdi", "Fare pencerede ilerliyor", "Klavyeden tuşa basıldı", "Ekranı boyamak gerekiyor", "Hala tepki veriyor musun?" vs. Son soru önemli Big Grin "Hala tepki veriyor musun?" sorusuna cevap vermezsek Windows programımızı "Not Responding" olarak görüyor. Programımız bu soruya cevap veremiyorsa "Ekranı boyamak gerekiyor" mesajına da cevap veremiyor demektir. Peki bunu sebebi ne? Bunun sebebi uzun sürecek bir işlemi uygulamanın ara yüzlerinin de çalıştığı main thread içinde yaptırmamız. Aslında yanlış olan kısım bu. Uzun süren işlemler (aslında neredeyse hiçbir işlem) ana thread üzerinde yapılmamalı, çünkü ana threadin asıl görevi kullanıcı ile etkileşimi yönetmek olmalı. İşte burada biz programcılara güzel (ve şeytani) bir çözüm geliyor: Application.ProcessMessages. Bu komut "Windows'un gönderdiği mesajlara cevap ver" anlamına geliyor ki bunların içinde "Ekranı boyamak gerekiyor" ve "Hala tepki veriyor musun?" mesajları da var. Uzun sürecek bir döngüde belirli aralıklarla Application.ProcessMessages çalışacak olursa Delphi'nin standart mesaj işleme döngüsü bekleyen mesajları işler ve uygulamanız "not responding" durumuna düşmez. Tabii Windows'un mesajlarına cevap verirken sizin döngünüz de bekler. Güzel bir çözüm gibi görünüyor, ama aslında bu uygulamayı yanlış tasarladığınız gerçeğini saklıyor. Yazarken bile belli olmuştur aslında, çünkü Windows'un mesajlarına cevap verirken sizin döngünüz bekliyorsa(!) işleminiz bu beklemeden dolayı daha uzun sürecektir. Oysa bu işi başka bir thread'e yaptırmış olsaydınız, büyük ihtimalle işleminiz daha kısa sürede bitecek, uygulamanızda ekranı boyamakla ilgili sorunlar olmayacak ve "not responding" durumuna düşmeyecektiniz. Tabii bunun karşılığında da daha fazla kod yazacak ve daha dikkatli tasarım yapmanız gerekecekti.

Son olarak, @mcuyan ın tavsiye ettiği kod bloğunu, yani Anonymous Threadleri, Threadler konusunda ciddi bir bilgi birikimine sahip olmadan kullanmanız biraz tehlikeli olabilir, çünkü thread'lerden kaynaklı hataları yakalamak çok daha zordur. Hatalar düzensiz olabilir, çok nadir olabilir, alakasız yerlerde çıkabilir, uygulamanız kapanırken çökebilir vs. Forumda ve internette çokca örnek var. Bir yerden değil, en baştan başlayın Smile takıldığınız yerlerde gerek forumda, gerekse internette bolca kaynak bulacaksınız.

İyi çalışmalar
Cevapla
#6
Yanlış bildiğimi düzelttiğiniz için teşekkür ederim..

Ben genelde threadları: DB'den Comboboxa data doldururken vs gibi işlemlerde kullandığım için benim için büyük problem olmuyor.

Ama bir daha ki sefere öneriniz doğrultusunda devam edeceğim.

Teşekkürler.
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#7
(23-02-2022, Saat: 08:16)Bahadir.Alkac Adlı Kullanıcıdan Alıntı:
(22-02-2022, Saat: 17:52)mcuyan Adlı Kullanıcıdan Alıntı: Ben şu şekilde Kullanıyorum.


TThread.CreateAnonymousThread(
   procedure()
   begin
     TThread.Synchronize(TThread.CurrentThread,
       procedure()
       begin
      // İşlemler
       end);


   end).Start;


Mobillerin çalışma prnesibi Windows gibi değildir. Windows da bi işlem bitmeden diğerine geçmez.. Bu nedenle işlem uzun ise application.Processmessage ile kilitlenmeyi donmeyıönleriz.

Fakat mobillerde durum böyle değildir. 
O kod cpu ya gönderiliriz.. Bitmesi beklemden diğer koda geçilir..

Eğer bitmesini beklemek istiyorsanız yukarıdaki thread'ı kullanmanız gerekiyor.

Merhaba,

Maalesef açıklamalar doğru değil. Windows gibi diğer işletim sistemleri de bütün işlemleri sırayla yapar ve bir işlem bitmeden diğerine geçmez. Burada kafa karıştıran Anroid işletim sistemlerinde formların non-blocking olmasıdır. Yani ShowModal diye bir kavram yoktur. Bu yüzden de kodun tasarımının Windows ve iOS'dan farklı olması gerekiyor. Örneğin Android'de, Windows'daki gibi tipik bir giriş ekranı yapmak daha karmaşık, çünkü Kullanıcı Girişi penceresini ShowModal ile açamıyorsunuz ve kodunuz akıp gidiyor. Oysa Windows ve iOS'da ShowModal ile formu gösterdiğinizde blocking çalıştığı için pencere kapanana kadar kodunuz bekliyor. Buraya kadar bahsettiklerimizin de, dikkat ederseniz, Application.ProcessMessages ile ilgisi yok.

Peki Application.ProcesssMessages ne işe yarıyor? Çok basit. Windows'un uygulamalarla haberleşme yöntemi, pencerelere (aslında Handle'i olan bütün UI nesnelerine ve Handle'i olan gizli pencerelere) mesaj göndermektir. Örneğin "Fare pencereye girdi", "Fare pencerede ilerliyor", "Klavyeden tuşa basıldı", "Ekranı boyamak gerekiyor", "Hala tepki veriyor musun?" vs. Son soru önemli Big Grin "Hala tepki veriyor musun?" sorusuna cevap vermezsek Windows programımızı "Not Responding" olarak görüyor. Programımız bu soruya cevap veremiyorsa "Ekranı boyamak gerekiyor" mesajına da cevap veremiyor demektir. Peki bunu sebebi ne? Bunun sebebi uzun sürecek bir işlemi uygulamanın ara yüzlerinin de çalıştığı main thread içinde yaptırmamız. Aslında yanlış olan kısım bu. Uzun süren işlemler (aslında neredeyse hiçbir işlem) ana thread üzerinde yapılmamalı, çünkü ana threadin asıl görevi kullanıcı ile etkileşimi yönetmek olmalı. İşte burada biz programcılara güzel (ve şeytani) bir çözüm geliyor: Application.ProcessMessages. Bu komut "Windows'un gönderdiği mesajlara cevap ver" anlamına geliyor ki bunların içinde "Ekranı boyamak gerekiyor" ve "Hala tepki veriyor musun?" mesajları da var. Uzun sürecek bir döngüde belirli aralıklarla Application.ProcessMessages çalışacak olursa Delphi'nin standart mesaj işleme döngüsü bekleyen mesajları işler ve uygulamanız "not responding" durumuna düşmez. Tabii Windows'un mesajlarına cevap verirken sizin döngünüz de bekler. Güzel bir çözüm gibi görünüyor, ama aslında bu uygulamayı yanlış tasarladığınız gerçeğini saklıyor. Yazarken bile belli olmuştur aslında, çünkü Windows'un mesajlarına cevap verirken sizin döngünüz bekliyorsa(!) işleminiz bu beklemeden dolayı daha uzun sürecektir. Oysa bu işi başka bir thread'e yaptırmış olsaydınız, büyük ihtimalle işleminiz daha kısa sürede bitecek, uygulamanızda ekranı boyamakla ilgili sorunlar olmayacak ve "not responding" durumuna düşmeyecektiniz. Tabii bunun karşılığında da daha fazla kod yazacak ve daha dikkatli tasarım yapmanız gerekecekti.

Son olarak, @mcuyan ın tavsiye ettiği kod bloğunu, yani Anonymous Threadleri, Threadler konusunda ciddi bir bilgi birikimine sahip olmadan kullanmanız biraz tehlikeli olabilir, çünkü thread'lerden kaynaklı hataları yakalamak çok daha zordur. Hatalar düzensiz olabilir, çok nadir olabilir, alakasız yerlerde çıkabilir, uygulamanız kapanırken çökebilir vs. Forumda ve internette çokca örnek var. Bir yerden değil, en baştan başlayın Smile takıldığınız yerlerde gerek forumda, gerekse internette bolca kaynak bulacaksınız.

İyi çalışmalar

Verdiğiniz bilgiler için teşekkür ederim. Thread konusunda hem delphi Türkiyede hem de burada kendisiyle yıldızım barışmasa da @Tuğrul HELVACI üstadın çok güzel makaleleri var. Hepsini okudum ama kendisinin deyimiyle "korkulacak bir konu değilse" de Thread konusu gerçekten korkunç bir konu. Application.ProcesssMessages XE10'da çalışıyordu. İstediğim Listview dolarken döngü bitene kadar bekledikten sonra hepsini birden göstermek değil satır satır göstermek bu kadar basit.
Cevapla
#8
@Jakarta2,
Ben @mcuyan ın belirttiği şu yöntemle yapıyorum. 
Yani static bir thread içinde birkaç senkronize işi arda arda gerçekleştiriyorum. 
Android ve iOS tarafında bu yöntemi kullanıyorum.
Begin : = end / 2;
Cevapla
#9
@Jakarta2 Android yakasında bildiğiniz üzere bekletici unsur yoktur. Keşke basit isteklerin görece basit çözümleri her zaman olsaydı. Aslında basit olan çözümleri kendimiz zor hale getiriyoruz ya o da başka konu...

* Mevcut kullanımdaki ana hata ise Thread içinde mainthread ait unsuru kullandırtmışsınız ki thread içerisinde bu kaynağı üretip orada local kullanmak isteyebilirsiniz.

* Android için thread istemiyor olsanız da bir callback ve event mantığını artık kullanım envanterimize yerleştirmemiz gerekiyor.

Sizin örneğinizde, farklı URL'lerden gelen TEXT içerik, onun da parse edilmesiyle elde edilen başka URL'ye dallanarak yeni bir veri alınıyor gibi gördüm. Bunu alırken de donma olmasın da listede eklemeler görsel olarak aksın istemiş olabilirsiniz. 

İşte bu aşamada her bir satır çağrı için thread mantığı devreye giriyor çünkü her yeni dallanma küçük beklemeler yapacaktır. Thread sayısını da sınırsız yapamazsınız. Örneğin 500 URL için bekleme durumuna göre aynı anda çalışma ihtimali olan 1, 10, 100..500 thread vb kurmak da olmaz. 

1. Gelen veriyi sınırlandırmak. ( sayfalamak )
2. Web çağrılarını çalışma grupları halinde planlamak. ( GRUP = url + parse + alt url + parse + görsellik = 1 thread )

Gruplamanı önemini şununla ifade etmek isterim : 1,2,3,4,5,6....500 sıralı olası web url sıralamasını işlem sırasında birisi diğerinden daha az veri içerdiğinden erken biten diğerinin yerine geçecek gerçeği. Yani 1,3,2,4,6,5...500,499 gibisinden bir sonuç. Bu da ana listedeki sıralama ile ürün sırlamasının neden gruplanması gerektiğine işarettir.

Özet olarak Adnroid / FMX yapısı ekstra strateji ister. Bunun için öngörüleri kullanarak planlama yapmak şarttır..
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#10
(08-03-2022, Saat: 15:40)mrmarman Adlı Kullanıcıdan Alıntı: @Jakarta2 Android yakasında bildiğiniz üzere bekletici unsur yoktur. Keşke basit isteklerin görece basit çözümleri her zaman olsaydı. Aslında basit olan çözümleri kendimiz zor hale getiriyoruz ya o da başka konu...

* Mevcut kullanımdaki ana hata ise Thread içinde mainthread ait unsuru kullandırtmışsınız ki thread içerisinde bu kaynağı üretip orada local kullanmak isteyebilirsiniz.

* Android için thread istemiyor olsanız da bir callback ve event mantığını artık kullanım envanterimize yerleştirmemiz gerekiyor.

Sizin örneğinizde, farklı URL'lerden gelen TEXT içerik, onun da parse edilmesiyle elde edilen başka URL'ye dallanarak yeni bir veri alınıyor gibi gördüm. Bunu alırken de donma olmasın da listede eklemeler görsel olarak aksın istemiş olabilirsiniz. 

İşte bu aşamada her bir satır çağrı için thread mantığı devreye giriyor çünkü her yeni dallanma küçük beklemeler yapacaktır. Thread sayısını da sınırsız yapamazsınız. Örneğin 500 URL için bekleme durumuna göre aynı anda çalışma ihtimali olan 1, 10, 100..500 thread vb kurmak da olmaz. 

1. Gelen veriyi sınırlandırmak. ( sayfalamak )
2. Web çağrılarını çalışma grupları halinde planlamak. ( GRUP = url + parse + alt url + parse + görsellik = 1 thread )

Gruplamanı önemini şununla ifade etmek isterim : 1,2,3,4,5,6....500 sıralı olası web url sıralamasını işlem sırasında birisi diğerinden daha az veri içerdiğinden erken biten diğerinin yerine geçecek gerçeği. Yani 1,3,2,4,6,5...500,499 gibisinden bir sonuç. Bu da ana listedeki sıralama ile ürün sırlamasının neden gruplanması gerektiğine işarettir.

Özet olarak Adnroid / FMX yapısı ekstra strateji ister. Bunun için öngörüleri kullanarak planlama yapmak şarttır..


@mrmarman  Hocam yapmak istediğimi ve kodun yaptığını nokta atışı analiz etmişsiniz. Android için thread istemiyor değilim yanlış anlaşılma olmasın. Thread'in koda uygulamasını yapamıyorum. Dediğiniz gibi 2 işlem var. Öncelikle ana sayfa parse var ardından altsayfanın parsesi var.
1) Thread'i ya da threadleri nerelere koyacağım?
2) Hangi thread yapılarını hangi parse'de kullanacağım?
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Android Uygulama İkonu ARM 2 400 11-11-2025, Saat: 12:15
Son Yorum: ARM
  Android SDK kajmerantime 1 384 28-10-2025, Saat: 14:53
Son Yorum: cinarbil
  Android El Terminali Barkod Okuyucu Verisi tuna 0 334 17-10-2025, Saat: 01:07
Son Yorum: tuna
  Android işlem öneriliyor uyarısı! Coban 9 1.863 07-08-2025, Saat: 12:07
Son Yorum: RAD Coder
  FMX Android Adaptive Icons kullanabilir miyiz? egeven 1 2.156 30-06-2025, Saat: 21:46
Son Yorum: emozgun



Konuyu Okuyanlar: 1 Ziyaretçi