Thread içinden programı sonlandırmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
turkerunutmaz
Üye
Mesajlar: 57
Kayıt: 04 Oca 2008 04:53
Konum: İstanbul
İletişim:

Thread içinden programı sonlandırmak

Mesaj gönderen turkerunutmaz »

Merhaba.internetten programımı güncelleştiriyorum.Tabi dosya normalde inerken kitleniyor program.Ben de thread kullanıyorum.Fakat programı belli koşulda thread içinden kapamam lazım.Çözüm yolu nedir?

Kod: Tümünü seç

  Procedure kapat();
    begin
    Application.Terminate;
    end;

Kod: Tümünü seç

CreateThread(nil,0,@kapat,nil,0,i);
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Re: Thread içinden programı sonlandırmak

Mesaj gönderen undefined »

Niye başka bir thread yaratıp onla kapatmaya çalışıyorsun anlamadım. Zaten ana thread Gui işlemlerini yapar o yüzden başka threadden gui ile ilgili kodlar çalıştığında gibi sakatlıkların çıkacağı öngörülemez. Kapatılırkende muhtemelen gui nesneleri kodları çalışıyordur.
O yüzden bence o işlem ana threadden yapılmalı, fakat ana thread termnate edildiği zaman diğer çalışan threadler olacağı için yine öngörülemeyen sonuçlar olabilir.
O yüzden ilk önce diğer threadleri kapatılrıken yoketmen lazım.
Şunuda yapabilirin ana threadde bir wait ile

Kod: Tümünü seç

Procedure frm.kapat(); // senkronize olabilmesi için herhangi bir objeye bağlaman gerek
begin
     // Buraya diğer threadleri sonladıran kodları yaz
    Application.Terminate;
end;

Kod: Tümünü seç

Tthread.synchronize(kapat,nil);
veya bir tthread nesnesi içindeysen

Kod: Tümünü seç

Self.Synchronize(kapat);
veya Ana threadden diğer threadleri yarattıktan hemen sonra MsgWaitForMultipleObjects apisi ile diğer threadlerin bitmesini bekleyip hemen ardından yazacan terminate kodu ilede, threadlerin terminate olması ile otomatikman ana threadinde kapanmasını sağlayabilirsin. Normal wait fonksiyonları threadi tmmen dondurur, fakat MsgWaitForMultipleObjects ve MsgWaitForsingleObjects Gui mesajlarının geçmesine izin verir.

Kolay gelsin
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Re: Thread içinden programı sonlandırmak

Mesaj gönderen undefined »

Yazdığım ikinci yolu ben denemedim belki VCL mantığına ters olabilir, Delphi için yazılmış kod araştırmanı öneririm.
Kullanıcı avatarı
turkerunutmaz
Üye
Mesajlar: 57
Kayıt: 04 Oca 2008 04:53
Konum: İstanbul
İletişim:

Re: Thread içinden programı sonlandırmak

Mesaj gönderen turkerunutmaz »

Amacım dosya inerken formun kitlenmemesi.Ben idhtp ile indiriyorum.Bu esnada form kitleniyor.
Burada viewtopic.php?f=19&t=21175 mrmarman ın verdiği kodlardaki gibi yaptım.
Ama

Kod: Tümünü seç

 Application.Terminate;
  WinExec( PChar( ExtractFilePath(Application.Exename)+'Guncelle.BAT'), SW_Hide );
şu kısım işte thread içinde olduğu için kapanmıyor.Amacımı anlatabildim sanırım
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: Thread içinden programı sonlandırmak

Mesaj gönderen Battosai »

Thread işlem halindeyken..hata vermesi normal...windows apisi ile thread kullanmışın bunu pek bilmiyorum ama thread nesnesini kendin oluşturup..execute olayında meseleyi halledebilirsin...
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: Thread içinden programı sonlandırmak

Mesaj gönderen akdatilla »

belki yazdığın thread prosedürünün başına aşağıdaki kodu yazarsan hata çıkmaz.

Kod: Tümünü seç

if Application.terminated then exit;
Cevapla