Thread beklemesin çalıştırıp devam etsin.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Thread beklemesin çalıştırıp devam etsin.

Mesaj gönderen Bay_Y »

Herkese Merhabalar Öncelikle ;

function GorseliGonder( GonderilecekDosya , isim : String ) : Boolean ;
Begin
try
FtpParametre;
With FrmAnaMenu do begin
IdFTP1.Connect;
if (FileExists(GonderilecekDosya)) then
begin
IdFTP1.Put(GonderilecekDosya,isim,false);
result := true ;
end else
begin
result := false ;
end;
End;
except
on E: Exception do begin
ShowMessage('FTP Hatası: '+E.ToString);
end;
end;
FrmAnamenu.IdFTP1.Disconnect;
End;


procedure BuildThread;
var
myThread: TThread;
begin
myThread := TThread.CreateAnonymousThread(
procedure
begin
GorseliGonder( GonderilecekDosya , isim );
end);
myThread.FreeOnTerminate := True ;
end;


Bu şekilde gönderim yaptığımda dosya gidiyor fakat bazen ftp ye bağlanmak için beklediğinden dolayı sebebsiz bir bekleme oluyor acaba bu işlem başladığında beklemeden devam etse ( yani fonksiyonu çalıştırıp devam etse olabilir mi ? ) çünkü bundan gelen onaya göre kayıt işlemleri ve farklı işlemler yapılması gerekiyor ve bazı durumlarda onlarda 4-5 sn bekliyor.

Umarım anlatabilmişimdir derdimi , herkese teşekkürler.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Thread beklemesin çalıştırıp devam etsin.

Mesaj gönderen ertank »

Merhaba,

Öncelikle örnek kodlarınızı "Tam Editör & Önizleme" modunda kod blokları içinde paylaşmanızda fayda var. Okunabilirlikleri artmaktadır. Ayrıca, her bir begin..end arasında kalan kodları en az iki boşluk bırakarak içeriden yazmanız kod okunurluğunu son derece arttırır.

Küçük bir not olarak eğer Delphi sürümünüz son sürümlerden ise TThread yerine kullanım kolaylığı getirmek adına TTask sınıfını daha pratik bulabilirsiniz.

Sorunuza gelince;
FTP işlemini yerel ağ üzerinden mi yoksa internet üzerinden mi kullandığınızı belitrmemişsiniz. Eğer doğru anladı isem siz thread içinden cevabı hemen almak istiyorsunuz. Şunu unutmayın, FTP işlemi tamamlanmadan veya hataya düşmeden True/False bilgisi almanız mümkün değil. Thread içinde çalışıyor olması bunu mümkün kılmaz. Thread sadece grafik işlemleri dışındaki işlemlerin arka planda yapılmasına olanak sağlar ki grafik arayüzü olan ana uygulamanız yanız vermez duruma düşmesin.

Yani eğer sorununuz donma değil ancak thread içinde çalışan koddan cevabın geç gelmesi ise (örnek kodunuza cevaben yazıyorum) bunu önlemenin bir yolu bildiğim kadarıyla yok. Zira bekleme süreniz FTP işlemlerinin tamamlanması için geçen süredir. Thread olsun olmasın bu işlemler tamamlanmadan kendi işleminize devam edemiyor iseniz Indy bileşenlerinden AntiFreeze bileşenini for üzerine koyun ve hiç thread kullanmadan işleminizi gerçekleştirin. Çünkü bu bekleme süresinden kaçışınız yok.

Kullanıcıyı daha sabırlı kılmak adına mevcut Thread kullanımı ile birlikte statü kodları kullanabilirsiniz. Paylaşımlı bir değişken içine bağlantı kuruluyor, bağlantı kuruldu, dosya gönderiliyor gibi her bir FTP durumu değiştiği zaman kullanıcıyı bilgilendirebilirsiniz.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Thread beklemesin çalıştırıp devam etsin.

Mesaj gönderen Bay_Y »

Öncelikle cevabınız için çok teşekkür ediyorum , kod kısmına gelince oda kopyalarken sanırım kaydı kusura bakmayın , aslında cevabı kilitlenmeden dolayı istiyordum Kullandığım delphi sürüm XE2 sanırım TTask mevcut Xe den sonra destekliyordu yanlış bilmiyorsam ama benim tam sorunum şu izin verirseniz biraz daha açıklayıcı yazayım. Ön tarafta bazı işlemlerin yapılması lazım kullanıcı tarafında mesela kayıtlar girecek ve okuyacak ama bunlar olurken arka tarafta da ben istiyorum ki database den bazı kayıtlar okuyarak onları gerekli yerlere işlemek istiyorum bu işlemleri yaparken sistemde kilitlenme ve donma olmaması adına thread kullanmak istiyorum ama doğru mu yapıyorum bundan da çok emin değilim , işlemlerin çok hızlı olmasından ziyade sorun çıkarmasın ve sistemi kilitlemesin benim için yeterli.

Yukarıda bahsettiğiniz Antifreeze i bu konu için kullanabilir miyim ? Dediğim gibi ftp ye küçük resimler gönderip alacağım ve database e kayıtlar yazacağım ama internetin olmadığı durumlarda kayıtlar birikebilir bu durumda aktarım olurken kilitlenme ve donma olmaması için Antifreeze işimi görebilir mi ? Çok teşekkürler tekrar.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Thread beklemesin çalıştırıp devam etsin.

Mesaj gönderen ertank »

Merhaba,

Verilen cevap örnek kod ve soruya özel idi. Antifreeze Indy ile yapılan işlemlerin ana uygulama thread'i içinde donma yapmamaya gayret ederek çalışmasına yarayan bir bileşendir. Yani siz TIdFTP bileşenini form üzerine koyup. Yanına Antifreeze bileşeni ekleyerek uzun süren dosya yükleme/indirme sırasında uygulamanın cevap vermez hale gelmesini engellemiş olursunuz. Ancak, dosya iner iken kullanıcı başka bir işlem yapamaz. Yine o süreyi beklemek zorundadır. Antifreeze TThread kullanımını bazı durumlarda ortadan kaldırır.

Sizin esas yapmak istediğiniz database işlemleri veya TThread ile yapılacak işlemler ile Antifreeze bileşeninin hiç ilgisi yoktur.

Bahsettiğiniz database işlemlerini TTask kullanarak yapmanız mümkün. TThread kullanarak yapmanız da mümkün. TTask özünde daha pratik kullanımlı bir TThread tir. Yani TThread kuralları aynen TTask içinde geçerlidir. Bu anlamda en önemli kural "thread içinde grafik arayüz ile ilgili işlem yapılamaz" kuralıdır. Yapılması gereken işlemleri senkronizasyon yardımı ile grafik işlemlerin yapıldığı uygulama ana thread'ine yaptırmalısınız. Bu zorunluluk Windows işletim sisteminin getirdiği bir zorunluluktur. Yani Delphi, C#, VB.NET, Java vs. bütün programlama dilleri ile geliştirilen uygulamalar bu kurala uymak durumundadır. Yanlış bilmiyor isem aynı kural Linux içinde çalışan grafik uygulamalar içinde mevcuttur.

Yapacağınız database işlemleri bir şekilde tablo içindeki kayıtları kilitleyecek türden işlemler ise dikkatli olmanızı öneririm. Thread içinde kayıtlar kilitlenip normal kullanıcının kilitli kayıtlar ile çalışmasına engel teşkil edebilirler.

Ayrıca, eğer yapacağınız database işlemleri işletim sistemini yoracak cinsten işlemler ise "donma" olarak bahsettiğimiz konu uygulamanın yanıt vermez hale gelmesi değil, işletim sisteminin çok yoğun işlem yaptığı için yanıt vermez hale gelmesi olabilir. Bu ikisini birbirinden ayırmakta fayda var.

Eğer işletim sistemi çok yoğun çalışıyor ise belki bu işlemleri yapacak ayrı bir uygulama geliştirip Windows Zamanlanmış Görevler içinden ayarlayarak otomatik gece geç saatlerde çalıştırabilirsiniz. Ya da bir servis uygulaması geliştirip işlemlerin sistemin yoğun olmadığı zamanlarda ya da belli saatlerde çalışmasını sağlayabilirsiniz.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Thread beklemesin çalıştırıp devam etsin.

Mesaj gönderen Bay_Y »

Çok teşekkür ederim , değerli vaktiniz ve bilgileriniz için , kusura bakmayın oldukça fazla vaktinizi aldım.
Cevapla