Döngü yerine Thread.

FireMonkey ve Mobil uygulama (iOS, Android, Windows Phone) ile ilgili sorularınızı bu foruma sorabilirsiniz.
Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Re: Döngü yerine Thread.

Mesaj gönderen RADCoder »

Sayın Tuğrul HELVACI hocam konuya ilginizden dolayı teşekkür ederim.
Konularınızı okumaya başladım. Okuduğum her bloğu tekrara tekrar okuyup anlamaya çalışıyorum..
Ben çok geç anlarım, o yüzden defalarca okuyup ne olduğunu anlamaya gayret ediyorum.
Ama anladığım bir şeyi çok iyi kullanmasını da bilirim.

Cevabınız için tekrardan teşekkür ederim..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Döngü yerine Thread.

Mesaj gönderen mrmarman »

(1) Numaralı önermen doğru.
(2) numaralı önermen ise normalde şu andaki tasarlanmış hali hazırda kullandığındır zaten.
(3) Thread demek zaten çalışan her bir kanala verilen ismin orjinalidir. Her thread'in müstakil bir ThreadID'si vardır.

(*) Sana verdiğim örneği denemedin mi yoksa ? Tam da bu işi yapıyor.
Her bir eklenen thread için ListBox'a bir satır ekliyor ve thread'in hayatı boyunca aşağıdaki işlemleri yapıyor.

(1) Thread başlamadan önce (0) yazıyor.
(2) Thread başlayınca 10 adım için her bekleme anının kaç saniye olacağını yazıyor.
(3) Thread bitince de 'bitti' yazıyor.

Bu üç işlemde de her thread listbox'un her zaman kendi adına rezerve edilmiş satırını kullanıyor.
Resim
Resim ....Resim
Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Re: Döngü yerine Thread.

Mesaj gönderen RADCoder »

(*) Sana verdiğim örneği denemedin mi yoksa ? Tam da bu işi yapıyor.
Verdiğiniz örneği denedim, söylediklerinizi harfiyen gördüm hatta kodların bazılarını yorum satırı yaparak nasıl bir hata alacağımın da şahit-i oldum..
Örneğinizde düzenleme yapamadığım şeyleri yeniden örneklendirmek istedim.

Mesela:
Ben her buttona tıklama yaptığımda tread oluşturuyor.
Kanal sınırı 3-tür, ki buda mantıksal olarak 3 tane progressbar kullanılmasından dolayıdır.
Ama ben orada bir Progressbar ekleyip istenilen düzenlemeyi yapa bilirim. Ama sadece progressbar için geçerli kalır.
Tek tıklamada istediğim sayıda Kanal oluşturamadım ve orda olduğu gibi Tıklama yaptığımızda ListBox1-e bir ThreadİD-si yazar.
Şimdi ben bir tıklamada 5 kanal oluşturuyor sam ListBox1-e 5 farklı ThreadİD-si yaratmalı ve Yaranmış kanalları gerekli İtemlerle ilişkilendirmem gerekiyor.
İşte bu yüzden böyle bir örnek istedim..

Verdiğiniz örneği görmeden hakkında konuşmak ne haddime.

Teşekkürler..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Döngü yerine Thread.

Mesaj gönderen mrmarman »

Aynı anda 5 thread nasıl başlıyor örneğinide bu mesaj ekine ekledim. Bunu iyice anlamaya çalışmalısın.

Resim
Dosya ekleri
ThreadOrnegi_5ThreadBaslat.rar
5 Thread Birden Başlat
(205.22 KiB) 211 kere indirildi
Resim
Resim ....Resim
nguzeller
Üye
Mesajlar: 109
Kayıt: 19 Oca 2004 03:29

Re: Döngü yerine Thread.

Mesaj gönderen nguzeller »

thelvaci yazdı:Aşağıdaki linkten ilgili makaleleri okuyup özümsemeye çalışmanızdan sonra aklınıza takılan sorular olursa buradan yine yardımcı olmaya çalışalım.

http://www.tugrulhelvaci.com/?tag=thread
http://www.tugrulhelvaci.com/?p=273

yazınız çok hoşuma gitti, teşekkerler. 1 dosyayı parçalıyıp indirdiğimizde inderme hızısının artadığın hatta inen dosyaları birleştirme yaptığı için daha uzun sürede işlem yaptığını kendi pc de test ettim, kullandığım pc tüm hızı kullandığı için de böyle oluyor anladığım kadarı ile bu da şunu düşündürdü aynı anda çok fazla veriyi indirmeye çalışmak çok da iyi fikir değil gibi daha çok arka planda işlemesi gereken işlerde daha faydalı gibi geldi bana siz ne düşürüsünüz.
Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Re: Döngü yerine Thread.

Mesaj gönderen RADCoder »

Çok sağ ol Muharrem abi, örneği indirdim projeyi açtığımda eski projeyle karşılaştım.
Sanırım bir yanlışlık olmuş..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Döngü yerine Thread.

Mesaj gönderen mrmarman »

Altta yeni bir button var. 5 threadi tek buton ile başlatıyor. Merak ettiğin bu değil miydi ?

- Şimdi senin download işlemlerini her birinin müstakil thread'e koyar öyle sunardım ama bir süre daha yapmak istemiyorum. :oops:

- Sana daha önce bu ve diğer forumda hep yaptığım gibi hazır kod yazmak istemediğimden bu kadar uzatıyorum. Bu işi kavramadan yani balığı tutmayı öğrenmeden bir sonraki aşamaya geçmekten imtina ediyorum. Çünkü günü kurtarmak geleceği teminat altına almıyor. Keza o zaman da yeni proje hali ne ise ona göre bu soruların yeniden sorulmasını istemiyorum. Bu başlığın muhataplarından Tuğrul bey bile daha önce bir mesaj ile hazır kod verme rejimini iyi niyetle -haklı olarak*- eleştirmişti. Buna da saygı duymak lazım. :idea:

- Şimdi en azından konuyu kavramak adına başka bir proje hazırla. Verdiğim örnek üzerinden download işlem(ler)ini thread üzerinden gerçekleştir. Mesela IMDb'den top250 film listesini alsın, her bir filmin de yönetmenini IMDb ID'lerinden threadler ile müstakil olarak download etsin.

- Bunu yaptığında kendi projen ile benzer işi yapmış, çözüme ulaşmış olacaksın. :idea:
Resim
Resim ....Resim
Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Re: Döngü yerine Thread.

Mesaj gönderen RADCoder »

Muharrem abi kızmanıza gerek yok, ama yüklediyiniz eki bir indirip bakarmısınız.

Unitinizi paylaşıyorum:

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ComCtrls;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    ListBox1: TListBox;
    ProgressBar1: TProgressBar;
    ProgressBar2: TProgressBar;
    ProgressBar3: TProgressBar;
    ListBox2: TListBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure BitBtn1Click(Sender: TObject);
  private
    procedure KanalBitti(Sender: TObject);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Uses DateUtils;

type
  TBirDonguKanali = class(TThread)
  protected
    procedure Execute; override;
  end;


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if ListBox1.Items.Count < 3 then
  begin // 3 Kanal ile sınırlandırdık...
    With TBirDonguKanali.Create(False) do
    begin
      OnTerminate := KanalBitti;
      ListBox1.Items.Add( IntToStr( ThreadID ) ); // Eklen Thread'in kendi Unique ID'si
      ListBox2.Items.Add( '0' ); // Bekleme Süresi (thread içinden güncellenecek)
    end;

    ProgressBar1.Max := 10;
    ProgressBar2.Max := 10;
    ProgressBar3.Max := 10;

    case ListBox1.Items.Count of
    1: ProgressBar1.Position := 0;
    2: ProgressBar2.Position := 0;
    3: ProgressBar3.Position := 0;
    end;
  end;
end;

procedure TForm1.KanalBitti( Sender:TObject );
begin
  // Her açılan thread bittiğinde buraya da Form içinden ulaşır..
  // Dilersen burayı da kullanabilirsin.
  ShowMessage( IntToStr( TThread(Sender).ThreadID ) + ' ID''li Thread Bitti...' );
end;

{ TBirDonguKanali }

procedure TBirDonguKanali.Execute;
Var
  iSayac  : Integer;
  Zaman   : TDateTime;
  Bekleme : Integer;
  ThreadID,
  idx : Integer;
begin
  Randomize;
  Bekleme  := Random( 5 )+1; // 1 ile 5 arasında bir rakam alacak...
  ThreadID := TThread(Self).ThreadID; // Kendi Thread'imizin ID'sini böyle alıyoruz.
  idx      := Form1.ListBox1.Items.IndexOf( IntToStr( ThreadID ) ); // Hangi ITEM'e aitiz ?

  // Burada Thread içinde Form üzerindeki bir ListBox'un ilgili Itemini güncelledik.
  Form1.ListBox2.Items[idx] := IntToStr(Bekleme) + ' Saniye';

  Zaman    := Now();
  Zaman    := incSecond( Zaman, Bekleme );
  iSayac   := 0;
  while iSayac <= 10 do
  begin
    while Zaman > Now() do
    begin
      Application.ProcessMessages;
    end;
    case idx of
    0: Form1.ProgressBar1.Position := iSayac;
    1: Form1.ProgressBar2.Position := iSayac;
    2: Form1.ProgressBar3.Position := iSayac;
    end;
    Zaman := incSecond( Zaman, Bekleme );
    Inc(iSayac);
  end;
  // İlgili Item'in nihai değerini de güncelledik...
  Form1.ListBox2.Items[idx] := 'Bitti';
  // Burada sona erdi...
  inherited;
end;

end.

Burada ikinci bir button yok..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Döngü yerine Thread.

Mesaj gönderen mrmarman »

Haklısın, diğer klasörü vermişim. Özür dilerim. :oops:

Kod: Tümünü seç

Uses DateUtils;

type
  TBirDonguKanali = class(TThread)
  protected
    procedure Execute; override;
  end;


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if ListBox1.Items.Count < 3 then
  begin // 3 Kanal ile sınırlandırdık...
    With TBirDonguKanali.Create(False) do
    begin
      OnTerminate := KanalBitti;
      ListBox1.Items.Add( IntToStr( ThreadID ) ); // Eklen Thread'in kendi Unique ID'si
      ListBox2.Items.Add( '0' ); // Bekleme Süresi (thread içinden güncellenecek)
    end;

    ProgressBar1.Max := 10;
    ProgressBar2.Max := 10;
    ProgressBar3.Max := 10;

    case ListBox1.Items.Count of
    1: ProgressBar1.Position := 0;
    2: ProgressBar2.Position := 0;
    3: ProgressBar3.Position := 0;
    end;
  end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
Var
  i : Integer;
begin
  ListBox1.Items.Clear;
  ListBox2.Items.Clear;
  ProgressBar1.Max := 10;
  ProgressBar2.Max := 10;
  ProgressBar3.Max := 10;
  ProgressBar4.Max := 10;
  ProgressBar5.Max := 10;

  ProgressBar1.Position := 0;
  ProgressBar2.Position := 0;
  ProgressBar3.Position := 0;
  ProgressBar4.Position := 0;
  ProgressBar5.Position := 0;
  for i := 1 to 5 do
      ListBox2.Items.Add( '0' ); // Bekleme Süresi (thread içinden güncellenecek)

  for i := 1 to 5 do
  begin
    With TBirDonguKanali.Create(False) do
    begin
      OnTerminate := KanalBitti;
      ListBox1.Items.Add( IntToStr( ThreadID ) ); // Eklen Thread'in kendi Unique ID'si
    end;
    Application.ProcessMessages;
  end;

end;

procedure TForm1.KanalBitti( Sender:TObject );
begin
  // Her açılan thread bittiğinde buraya da Form içinden ulaşır..
  // Dilersen burayı da kullanabilirsin.
  ShowMessage( IntToStr( TThread(Sender).ThreadID ) + ' ID''li Thread Bitti...' );
end;

{ TBirDonguKanali }

procedure TBirDonguKanali.Execute;
Var
  iSayac  : Integer;
  Zaman   : TDateTime;
  Bekleme : Integer;
  ThreadID,
  idx : Integer;
begin
  Randomize;
  Bekleme  := Random( 5 )+1; // 1 ile 5 arasında bir rakam alacak...
  ThreadID := TThread(Self).ThreadID; // Kendi Thread'imizin ID'sini böyle alıyoruz.
  idx      := Form1.ListBox1.Items.IndexOf( IntToStr( ThreadID ) ); // Hangi ITEM'e aitiz ?

  // Burada Thread içinde Form üzerindeki bir ListBox'un ilgili Itemini güncelledik.
  Form1.ListBox2.Items[idx] := IntToStr(Bekleme) + ' Saniye';

  Zaman    := Now();
  Zaman    := incSecond( Zaman, Bekleme );
  iSayac   := 0;
  while iSayac <= 10 do
  begin
    while Zaman > Now() do
    begin
      Application.ProcessMessages;
    end;
    case idx of
    0: Form1.ProgressBar1.Position := iSayac;
    1: Form1.ProgressBar2.Position := iSayac;
    2: Form1.ProgressBar3.Position := iSayac;
    3: Form1.ProgressBar4.Position := iSayac;
    4: Form1.ProgressBar5.Position := iSayac;
    end;
    Zaman := incSecond( Zaman, Bekleme );
    Inc(iSayac);
  end;
  // İlgili Item'in nihai değerini de güncelledik...
  Form1.ListBox2.Items[idx] := 'Bitti';

  // Burada sona erdi...
  inherited;
end;
Dosya ekleri
ThreadOrnegi_5li.rar
proje
(205.42 KiB) 191 kere indirildi
Resim
Resim ....Resim
Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Re: Döngü yerine Thread.

Mesaj gönderen RADCoder »

Merhabalar.
Özür dilemenize gerek yoktu Muharrem abi. Sadece çok fazla önyargılısınız.
Benim sorduğum soruların hepsini, sanki yaptığım bir projede skışık duruma düştüğüm gibi buraya koşup soru sorup hazır kod alıp projeme gömüp öğle iş yaptığımı sanmayın. delphidunyasi.net-dede aynı şeyleri bana sölemişdiniz. Konuyu bile açarken tekrar aynı şeyleri işitmemek adına yazımla isminizi geçerek kızacağınız doğrultusunda şüphelerimin olduğunu okumuşsunuszdur.. Mobil platform çok yeni ve ben sadece birşey öğrenmek adına çabalıyorum.
Yani kendim için yapıyorum bunu. Bu güne kadar ticari anlamda satdığım programların hiç birisinde kimsenin emeği yada tek satır kodu söz konusu olmaz.
Yazılımcı bir başkasının kod bloğunu bire bir kendi projesine dahil etmez hatda edemez. Çünki düşünceler farklıdır ve çakışır..
Bir başkasının kod bloğunu sadece incelersiniz yeni üreti yapar sonra kodları tamı tamına düzenlemeden sıfırdan yazarsınız..
Size katılıyorum değerli vaktinizi aldım ve zaman ayırıp buraya girrerek her hangi bir şekilde yardımcı olmaya çalıştınız.. Diğer taraftanda kopyala yapıştır mantığı ile yazılım olamaz, ama benim böle bir şey için her defasında sizden hazır kod talebim olmadan ismime böle birşeyi yakıştırmanız rahatsız edici.. Sonuçta bizler sanal ortam olarak bir birimizi tanıyoruz görmeden değerlendirerek kişiliklerimiz hakında bilmeden konuşmak doğru deyildir.
Dün akşamı gerçekten çok zor geçirdim, sabaha kadar sadece tavana baktım. Nedeni siz değilsiniz, nedeni benim burada bulunmam ve yalnış anlaşılmam.
Yukardada söylediyim gibi evet ben çok geç anlarım ama anladığımı her zaman çok güzel kullanmasınıda bilirim.

Bu konu sonucunda anladığım şu olduki, Thread yada Thread olmadan:

1. Senaryo
2.Gösterim
3.Kullanıcı yaptığı işlemin ne için olduğunu anlamsı
4.Bekleyip beklemediyini bilmesi
5.Ne için beklediyini bilmesi

Bunlar olduğu sürece kullanıcı sıkılmayacaktır..
Sizinde dediyiniz gibi zaman hep aynıdır sadece ilizyon gerkli..

Sizi kızdırdığım için üzgünüm, Yardımlarınız için teşekkürler..
Herkes kendi sorununu kendisi çöze bilir, çözemese bile her yerde paylaşmak doğru değildir en azında yanlış anlaşılmamak için.

Şimdi diyiceksiniz ki neden akşam yanıt yazmadınızda şimdi yazdınız.
Yorumunuzu okuduğum an değilde sonra çok fazla tesir etdiyi için sustum..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Döngü yerine Thread.

Mesaj gönderen mrmarman »

RADCoder yazdı:Özür dilemenize gerek yoktu Muharrem abi. Sadece çok fazla önyargılısınız.
...
Yukardada söylediyim gibi evet ben çok geç anlarım ama anladığımı her zaman çok güzel kullanmasınıda bilirim.
...
Yorumunuzu okuduğum an değilde sonra çok fazla tesir etdiyi için sustum..
- Burada mobil platform veya win32 uygulaması ayrımı yapmadan bir THREAD mantığını masaya yatırıyoruz. Bir platformun yeni veya eski olması hususu, şimdiki bu konu için ikinci plandadır.
...
- Sana yazılım hayatında başarılar diliyorum.
Resim
Resim ....Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Döngü yerine Thread.

Mesaj gönderen thelvaci »

Sevgili kardeşim, muharrem bey'in sizin kalbinizi kırmak gibi bir gayreti olduğunu sanmıyorum. Sizi eleştirmek niyeti ile değil de öğrenmenize vesile olmak için çaba sarfettiğine inanıyorum. Threading denilen konu basit bir husus değil; öte yandan o kadar zor bir husus da değil. Sadece kurallarını bilmek, işletim sisteminin çalışma yapısına biraz hakim olmayı gerektiriyor. Ve inanın bana, bu hususlara vakıf olmanız, yazacağınız deneme projeleri ile değil, işletim sistemleri hakkındaki makale ve kitapları okuyarak daha hızlı gerçekleşir. Mühim olan bir thread oluşturup onun altında kod yazma yeteneğine haiz olmak değil, o thread'in ve benzer thread'lerin paylaşılan verilere erişimini düzgün bir şekilde yönetebilmektir.

Esas sorun, birden fazla thread'in ortak veri alanlarına erişip, onları kullanması sırasında gerçekleşir. İşte sırf bu sorunlardan ötürü, senkronizasyon mekanizmaları hayat bulmuştur. Sizden ricam benim makalelerim yada başkasının makaleleri, farketmez ama işletim sisteminin yapısı hakkında malumat elde etmeye çalışmanız yönünde olacaktır.

Bunu yaptığınız anda, gerek muharrem bey'in gerekse de benim gibi arkadaşlarınızın sizi eleştirme yolunda olmadığımızı, sadece kafanızdaki karışıklıkların aydınlanması için size yol göstermeye çalıştığımızı gözlemleyeceksiniz.

Esas soru, bir t zamanında, işletim sistemi üzerinde gerçekten de sadece 1 thread çalışıyor iken, biz nasıl oluyor da işletim sistemi içindeki tüm thread'leri paralel çalışıyor gibi görüyoruz. Bu ilüzyonun cevabını araştırmaya başladığınızda, thread scheduling kavramına girizgah yapmış olacaksınız. Ardından round robin ile tanışacaksınız, quanta zamanı ile karşılaşacaksınız. Sonra thread context'lerini anlamaya başlayacaksınız, instruction pointer'ın belirli bir yerden nasıl devam ettiğini kavramış olacaksınız.

Tüm bunları kavradığınızda, işini tam anlamı ile henüz tamamlayamamış bir thread kernel tarafından durdurulup, bir başka thread'e çalışması için şans tanınır ise, ortak veri bloklarına erişmeye çalışan ikinci thread'in okuyacağı datanın durumu hakkında sorular sormaya başlarsınız. Bu sorular, critical section, mutex, semaphore, interlocked fonksiyonları, waitable timer vb. senkronizasyon mekanizmalarını görmenize ve merakınızın bir kat daha artmasına neden olacak.

Öğrendikçe daha da acıkacaksınız, kendinize sınır vurmayın; gizli dünyaya bir adım atın ;)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Döngü yerine Thread.

Mesaj gönderen thelvaci »

nguzeller yazdı:
thelvaci yazdı:Aşağıdaki linkten ilgili makaleleri okuyup özümsemeye çalışmanızdan sonra aklınıza takılan sorular olursa buradan yine yardımcı olmaya çalışalım.

http://www.tugrulhelvaci.com/?tag=thread
http://www.tugrulhelvaci.com/?p=273

yazınız çok hoşuma gitti, teşekkerler. 1 dosyayı parçalıyıp indirdiğimizde inderme hızısının artadığın hatta inen dosyaları birleştirme yaptığı için daha uzun sürede işlem yaptığını kendi pc de test ettim, kullandığım pc tüm hızı kullandığı için de böyle oluyor anladığım kadarı ile bu da şunu düşündürdü aynı anda çok fazla veriyi indirmeye çalışmak çok da iyi fikir değil gibi daha çok arka planda işlemesi gereken işlerde daha faydalı gibi geldi bana siz ne düşürüsünüz.
Merhaba, ilgili makaleyi beğenmenize sevindim. Ancak durum tam olarak sizin söylediğiniz gibi değil. Bir işin performanslı olması için kullandığımız thread'ler her zaman yeteri kadar performanslı olacaklar anlamına gelmez. Bunun pek çok nedeni var.

Örneğin; aksi belirtilmediği sürece işletim sistemi üzerinde create edilen bir thread işletim sisteminden 1 MB stack size reserve edecektir ve thread'lerin create edilmesinden ziyade onların scheduling'i yani zamanlaması çok maliyetli bir süreçtir.

Siz oluşturduğunuz thread'lerin priority'lerini below normal yada idle yapmış olabilirsiniz, bu durumda uygulamanızın main thread'i arka planda işlem yapacak olan thread'lerden daha fazla çalışma şansı yakalayabilir. Aynı zamanda, bir işi yapması için gerekenden fazla thread create etmiş olabilirsiniz; bu durumda ise kernel ilgili thread'leri zamanlayabilmek için çok zaman kaybedebilir dolayısı ile main thread'inizden daha uzun sürede sonuca ulaşmış olabilirsiniz.

Ne kadar çok thread o kadar kısa sürecek iş anlamına gelmez. Hatta çoğu durumda bunun tam tersi olur. Virtual memory'nin yetersiz olması, paging işlemlerinin sık sık yapılmasına, dolayısı ile thread'lerin scheduling zamanlarının uzamasına da neden olmuş olabilir.

Dolayısı ile thread kullanırken dikkat edilmesi gereken kurallar olduğu gibi, onların adetleri, priority'leri, hafızada kaplayacakları memory miktarı da düşünülerek hareket edilmelidir. Aksi durumda beklediğiniz performansı alamayabilirsiniz. Örneğin son derece basit bir GUI programı içinde oluşturacağınız thread'lerin işletim sisteminden işletim sistemine çalışma durumları ve performanslarında farklılıklar gözlemlenebilir. Bunun nedeni server işletim sistemlerinde, background thread'lere daha fazla öncelik tanınmasıdır. Server işletim sistemlerinde, işletim sistemini geliştirenler; GUI uygulamalarının değil, arka plandaki servis uygulamalarının daha performanslı çalışmasını arzulamışlardır.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Döngü yerine Thread.

Mesaj gönderen mrmarman »

thelvaci yazdı:Mühim olan bir thread oluşturup onun altında kod yazma yeteneğine haiz olmak değil, o thread'in ve benzer thread'lerin paylaşılan verilere erişimini düzgün bir şekilde yönetebilmektir.
- Bu başlık boyunca, okunan verinin rezerve edilen alanlara yerleştirilmesi konusunu anlatmakta başarılı olamadım. Konu gelen veriyi yönetebilmek. :idea:

- @thelvaci; bir ihtiyaca binaen herhangi bir referanstan bir thread her şeyi çözer lafı akla girince, süreç o ihtiyaç özelinde yürüyor. Sadece bu konu değil, programcılık alanındaki diğer her konuda da bir sabırsızlık durumu yaratıyor. Thread bağlamında işletim sisteminin mekanizmasını anlatmak bu mihmalde çok ütopik bir durum. Onun için basit anlamda gerçek hayattan örnekler sunmaya çalıştık ama olmadı. Mantık oluşmayınca asıl konuya giriş olamadı, elimden gelen budur. -bu başlık özelinde- benden bu kadar diyorum.
Resim
Resim ....Resim
Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Re: Döngü yerine Thread.

Mesaj gönderen RADCoder »

Sevgili kardeşim, muharrem bey'in sizin kalbinizi kırmak gibi bir gayreti olduğunu sanmıyorum. Sizi eleştirmek niyeti ile değil de öğrenmenize vesile olmak için çaba sarfettiğine inanıyorum. Threading denilen konu basit bir husus değil; öte yandan o kadar zor bir husus da değil. Sadece kurallarını bilmek, işletim sisteminin çalışma yapısına biraz hakim olmayı gerektiriyor. Ve inanın bana, bu hususlara vakıf olmanız, yazacağınız deneme projeleri ile değil, işletim sistemleri hakkındaki makale ve kitapları okuyarak daha hızlı gerçekleşir. Mühim olan bir thread oluşturup onun altında kod yazma yeteneğine haiz olmak değil, o thread'in ve benzer thread'lerin paylaşılan verilere erişimini düzgün bir şekilde yönetebilmektir.

Esas sorun, birden fazla thread'in ortak veri alanlarına erişip, onları kullanması sırasında gerçekleşir. İşte sırf bu sorunlardan ötürü, senkronizasyon mekanizmaları hayat bulmuştur. Sizden ricam benim makalelerim yada başkasının makaleleri, farketmez ama işletim sisteminin yapısı hakkında malumat elde etmeye çalışmanız yönünde olacaktır.

Bunu yaptığınız anda, gerek muharrem bey'in gerekse de benim gibi arkadaşlarınızın sizi eleştirme yolunda olmadığımızı, sadece kafanızdaki karışıklıkların aydınlanması için size yol göstermeye çalıştığımızı gözlemleyeceksiniz.

Esas soru, bir t zamanında, işletim sistemi üzerinde gerçekten de sadece 1 thread çalışıyor iken, biz nasıl oluyor da işletim sistemi içindeki tüm thread'leri paralel çalışıyor gibi görüyoruz. Bu ilüzyonun cevabını araştırmaya başladığınızda, thread scheduling kavramına girizgah yapmış olacaksınız. Ardından round robin ile tanışacaksınız, quanta zamanı ile karşılaşacaksınız. Sonra thread context'lerini anlamaya başlayacaksınız, instruction pointer'ın belirli bir yerden nasıl devam ettiğini kavramış olacaksınız.

Tüm bunları kavradığınızda, işini tam anlamı ile henüz tamamlayamamış bir thread kernel tarafından durdurulup, bir başka thread'e çalışması için şans tanınır ise, ortak veri bloklarına erişmeye çalışan ikinci thread'in okuyacağı datanın durumu hakkında sorular sormaya başlarsınız. Bu sorular, critical section, mutex, semaphore, interlocked fonksiyonları, waitable timer vb. senkronizasyon mekanizmalarını görmenize ve merakınızın bir kat daha artmasına neden olacak.

Öğrendikçe daha da acıkacaksınız, kendinize sınır vurmayın; gizli dünyaya bir adım atın ;)
Cevabınız için minnetdarım..
Anlamak zorluğu çeke biliyorum bazen, doğru bu benim beceriksizliyim ola bilir. Öğrenile bilirmi tabi uzun bir zaman alsa bile mutlaka isteniyorsa öğrenile bilir..Tuğrul Abi verdiyiniz sayfayı hala okumaktayım ama kodları kopyalayıp çalıştırmadım bile, çünki konuya hakim olamıyorum..
İlk önce olayı anlamak istemekteyim, ben kendimin çok iyi türkçe bildiyimi sanıyorudum ama oysaki yazdıklarınızı okuyup gerçekten açıkca söliyeceğim googlede sözleri aratıp anlamlarını buluyorum. Ne kadar doğru bilemem o yoldanda yüruyorum. Tabi bu okada önemli bir sorun teşkil etmemekte.

Muharrem Abim çok güzel bir şey vurgulamış:
Mantık oluşmayınca asıl konuya giriş olamadı.
Gerçek burada, mantığı kuramadım. Bazı konularda dediyim gibi beceriksiz ola bilirim..
Elbetdeki bu işlevi benim tarafımdan yapılmasını görmek istemektedir Muharrem abi, birşeyleri örete bilmesi acısından daha keyif alıcı olurdu..

Bir projeye başlamadan önce hepimiz araştırma yaparız, konuyla ilgili.
Bende araştırmalar yapıp hata denemeler yapmaya başladığımda bilginin çok geç işlendiyini gördüm.
Tabi bu işlem Windows ortamında çok güzel çalışırken Mobil tarafta malesef çok can sıkıcı bir bekletme yaşatmaktadır.

Ama hazır kod olayını gerçekten ihtiyaç duysam böle birşeye tenezzül etmem.
Drek Kod isterim.. Forumlardada olmasa kişisel olarak..

İşte:
bir ihtiyaca binaen herhangi bir referanstan bir thread her şeyi çözer lafı akla girince, süreç o ihtiyaç özelinde yürüyor
Doğrudur Thread olayı çözer kelimesi olaya atlamaya yeterli olmaktadır, ki asla Thread kullanmadım..

Sadece arka arka basdırıpta her soruya cevaplar yazmamın nedeni cevap vermek için çok kısa bir sürem olduğu içindir.
Kimseyi ve en önemliside kendimi madur duruma sokmamak için işi Java yazılımcısına devr etmem bence en doğrusu oldu..
O yüzden çok sık aralıklarla konuyu takip edipde olayı anlamaya çalışıyorum.
Son gelen ekte aynı kod yazınca Muharrem abim ister istemez kızdı.. :oops: Sizlere hak veriyorum ama benim sizler gibi düşemediyim ortadadır.
Ama Tuğrul abinin yazdıklarını okuyunca gerçekten basit olmadığını anladım. Bu günü kurtarmakla olmadığını bende çok iyi biliyorum. Onun içinde bir süre bilgisayardan uzak durup sonra temiz kafayla yazdıklarınızı okumaya ve örnekler yapmaya devam edeceğim..



Herşey için teşekkür ederim, hatalarım içinde çok çok özür dilerim..
Cevapla