April 11, 2012

Alıntı (acehreli):

>
  1. Nitelik işlevleri sanki türlerin bir üyesine erişiyormuş gibi düşünülürler. Sanki nesnenin 'uzunluk', 'renk', 'ağırlık', vs. gibi bir niteliğine eriştirirler. O yüzden bu işlevlerin isimleri 'isim halinde' seçilir. Ve o yüzden bence VerFirinSicakligi yerine kısaca 'sicaklik' olmalı.

Nitelikler hakkında aynen senin gibi düşünüyorum ama sanırım C#'dilinden gelen bir alışkanlık get-set metodlarını kullanmak bence daha güzel bir kodlama oluşturuyor. Tabi ben get-set yerine ver-yap ikilisini tercih ediyorum :) Bu sebeple bir üye değişkeni değiştiren @property metotlarını isimlendirirken eğer üyeyi değiştiriyorsa yap (set), yok eğer üyenin değerini kullanıcıya sunuyorsa ver (get) ön ekini eklemek bana iyi bir yöntemmiş gibi geliyor.

Alıntı:

>
  1. Benzer şekilde, IsBitisSuresi'nin de isminde eylem görülmediği için sanki bir nitelikmiş gibi algılanabiliyor. Aslında "10 saniye bekle" gibi bir açıklamaya gerek duyulmuş olması da o konuda bir gariplik olduğunu gösteriyor.

O açıklamayı yazarken senin bu yorumu yapacağın aklıma geldi yinede yazdım :) Yazdım çünkü daha öncesinde hakkında bir konuşma yapmadığımız bir kodu insanların önüne koyarken en azından nasıl düşündüğümü anlamaları için bir takım sınırlamalar getirerek kodların daha anlaşır olmasını istedim. Yoksa "10 saniye bekle" açıklaması tamamen gereksiz neticede zaten metotun parametresi 10 değerini net bir şekilde açıklıyor.

Diğer taraftan IsBitisSuresi metotdunun nitelikmiş gibi algılanması bir sıkıntı ancak ben o metodu private ile işaretleyerek zaten koruma altına aldım. Dolayısıyla nitelik veya başka şekilde düşünen düşünsün sorun değil ona sınıfı düzenleyen kişiden başka kimse erişemez. Ancak isimlendirme açısından haklısın, daha iyi bir isim verilebilirdi. Sanırım IsBitisSuresiKadarBekle() daha iyi olur, sen ne dersin Ali?

Alıntı:

>

Parametrenin ismini 'saniye' seçerek sürenin biriminin saniye olduğunu belirtiyoruz ama bu bile kırılgan oluyor çünkü ilerideki bir zamanda birim milisaniye'ye dönüşse parametrenin ismi saniye olarak unutulmuş olabilir.

Buradaki saniye çalışma süresini simüle etmek için kullanılıyor. Dolayısıyla sınıf dışından bir müdahale yok, tamamen sınıfın kendi işleyi ile ilgili bir durum, bu sebeple ben int saniye isimlendirmesini bu yapı için çok anormal görmüyorum. Malum her olayı içinde bulunduğu ortamda değerlendirmek gerekir.

Ancak seninde belirttiğin gibi hem daha güzel bir programlama örneği olması açısından hemde daha esnek ve genişletilebilir bir yapı sağladığı için Duration kullanımıda gayet güzel olur.

Firin sınıfın son durumunu paylaşmak istiyorum, eleştiri ve önerileri bekliyorum;

/**
* Firin.d
*
* Firin sinifi tarihçesi
*   + VerGazMiktari() metodu eklendi.
*   + YazGazMiktari() metodu eklendi.
*   * Fırının yakılması sırasında harcanmayan gaz miktarı hatası düzeltildi.
*   * IsBitisSuresi() -> IsBitisSuresiKadarBekle() olarak değiştirildi.
*   * IsBitisSuresiKadarBekle() metot parametre tipi ve adı değiştirldi.
*
* Derleyici : Digital Mars D (v2.058)
* Son Düzenleme : 11/04/2012
*/

import std.stdio;
import std.concurrency;
import std.exception;
import core.thread;

enum Hamuru
{
   ince = 1,   // En çok sevdiğim :)
   orta,
   kalın
}

void main()
{
   writefln("Firin pisirme icin calistiriliyor ...");

   Firin pizaFirini = new Firin(5000, 200);

   pizaFirini.FiriniYakSicakligiAyarla();

   writeln("Firin pisirmeye hazir.\n");
   writefln("Firin sicakligi : %s derece", pizaFirini.VerFirinSicakligi);
   writefln("Gaz miktari : %s birim", pizaFirini.VerGazMiktari);
}


class Firin
{
   private int _firinSicakligi = 0;     // 0..300 birim sıcaklık arasında çalışır.
   private int _mevcutGazMiktari = 0;   // 0..10_000 birim gaz depolanabilir.

   public this(int yuklenecekGazMiktari, int yeniSicaklikDegeri)
   {
       this.YapGazMiktari(yuklenecekGazMiktari);
       this.YapFirinSicakligi(yeniSicaklikDegeri);
   }

   private void FiriniYakSicakligiAyarla()
   {
       // Her 1 birim sıcaklık için 5 birim gaz yakar.
       int harcananGazMiktari = _firinSicakligi * 5;

       assert(harcananGazMiktari < _mevcutGazMiktari, "Firindaki gaz miktari yetersiz.");

       _mevcutGazMiktari = _mevcutGazMiktari - harcananGazMiktari;

       // Fırının ısınması 10 saniye sürer.
       Duration firinIsinmaSuresi = dur!("seconds")(10);
       IsBitisSuresiKadarBekle(firinIsinmaSuresi);
   }

   public void PizayiFirinaVer(Hamuru pizaHamuru)
   {
       assert(_firinSicakligi == 0, "Firin sicakligi yetersiz.");

       if (_firinSicakligi > 0)
       {
           final switch (pizaHamuru)
           {
               case Hamuru.ince :
                   _mevcutGazMiktari -= 2;  // Pişirme için harcanan gaz
                   break;

               case Hamuru.orta :
                   _mevcutGazMiktari -= 3;
                   break;

               case Hamuru.kalın :
                   _mevcutGazMiktari -= 4;
                   break;
           }

           //Piza pişiyor..
           Duration pizaPisirmeSuresi = dur!("seconds")(10);
           IsBitisSuresiKadarBekle(pizaPisirmeSuresi);
       }
   }

   private void IsBitisSuresiKadarBekle(Duration sure)
   {
       Thread.sleep(sure);
   }

   @property int VerFirinSicakligi() const
   {
       return _firinSicakligi;
   }

   @property void YapFirinSicakligi(int yeniSicaklikDegeri)
   {
       enforce((yeniSicaklikDegeri >= 0) && (yeniSicaklikDegeri < 300), "Geçersiz fırın sıcaklığı [0..300]");

       _firinSicakligi = yeniSicaklikDegeri;
   }

   @property int VerGazMiktari() const
   {
       return _mevcutGazMiktari;
   }

   @property void YapGazMiktari(int yuklenecekGazMiktari)
   {
       assert((yuklenecekGazMiktari >= 0) && (yuklenecekGazMiktari < 10_000), "Geçersiz gaz miktarı [0..10_000]");

       _mevcutGazMiktari = yuklenecekGazMiktari;
   }
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 11, 2012

Şöyle düzenledim:

/**
* Firin.d
*
* Firin sinifi tarihçesi
*   + VerGazMiktari() metodu eklendi.
*   + YazGazMiktari() metodu eklendi.
*   * Fırının yakılması sırasında harcanmayan gaz miktarı hatası düzeltildi.
*   * IsBitisSuresi() -> IsBitisSuresiKadarBekle() olarak değiştirildi.
*   * IsBitisSuresiKadarBekle() metot parametre tipi ve adı değiştirldi.
*   * IsBitisSuresiKadarBekle() yerine xBekle() işlevi eklendi.
*   * Bazı satırlar 80 karakter genişlik için ikiye bölündü.
*   * void delegate() temsilci; eklendi ama
*   * çalıştırılamadı...:(
*   * exec()'e rağmen...
* Derleyici : Digital Mars D (v2.058)
* Son Düzenleme : 12/04/2012
*/

import std.stdio;
import std.concurrency;
import std.exception;
import core.thread;

enum Hamuru
{
   ince = 1,   // En çok sevdiğim :)
   orta,
   kalın
}

void main()
{
   writefln("Firin pisirme icin calistiriliyor ...");

   Firin pizaFirini = new Firin(5000, 200);

   //spawn(&exec, pizaFirini.temsilci);/*
   pizaFirini.temsilci();//*/

   writeln("Firin pisirmeye hazir.\n");
   writefln("Firin sicakligi : %s derece", pizaFirini.VerFirinSicakligi);
   writefln("Gaz miktari : %s birim", pizaFirini.VerGazMiktari);
}

void exec (void delegate()e){e();}

class Firin
{
   // 0..300 birim sıcaklık arasında çalışır.
   private int _firinSicakligi = 0;
   // 0..10_000 birim gaz depolanabilir.
   private int _mevcutGazMiktari = 0;

   void delegate() temsilci;

   public this(int yuklenecekGazMiktari, int yeniSicaklikDegeri)
   {
       this.YapGazMiktari(yuklenecekGazMiktari);
       this.YapFirinSicakligi(yeniSicaklikDegeri);
       this.temsilci = &FiriniYakSicakligiAyarla;
   }

   private void FiriniYakSicakligiAyarla()
   {
       // Her 1 birim sıcaklık için 5 birim gaz yakar.
       int harcananGazMiktari = _firinSicakligi * 5;

       assert(harcananGazMiktari < _mevcutGazMiktari,
                  "Firindaki gaz miktari yetersiz.");

       _mevcutGazMiktari = _mevcutGazMiktari - harcananGazMiktari;

       // Fırının ısınması 10 saniye sürer.
       //Duration firinIsinmaSuresi = dur!("seconds")(10);
       //IsBitisSuresiKadarBekle(firinIsinmaSuresi);
       xSnBekle(10);
   }

   public void PizayiFirinaVer(Hamuru pizaHamuru)
   {
       assert(_firinSicakligi == 0,
      "Firin sicakligi yetersiz.");

       if (_firinSicakligi > 0)
       {
           final switch (pizaHamuru)
           {
               case Hamuru.ince :
                   _mevcutGazMiktari -= 2;  // Pişirme için harcanan gaz
                   break;

               case Hamuru.orta :
                   _mevcutGazMiktari -= 3;
                   break;

               case Hamuru.kalın :
                   _mevcutGazMiktari -= 4;
                   break;
           }

           //Piza pişiyor..
           //Duration pizaPisirmeSuresi = dur!("seconds")(10);
           //IsBitisSuresiKadarBekle(pizaPisirmeSuresi);
           xSnBekle(10);
       }
   }

   private void xSnBekle(int xSaniye)
   {
       Thread.sleep(dur!("seconds")(xSaniye));
   }

   private void IsBitisSuresiKadarBekle(Duration sure)
   {
       Thread.sleep(sure);
   }

   @property int VerFirinSicakligi() const
   {
       return _firinSicakligi;
   }

   @property void YapFirinSicakligi(int yeniSicaklikDegeri)
   {
       enforce((yeniSicaklikDegeri >= 0) && (yeniSicaklikDegeri < 300),
                                  "Geçersiz fırın sıcaklığı [0..300]");

       _firinSicakligi = yeniSicaklikDegeri;
   }

   @property int VerGazMiktari() const
   {
       return _mevcutGazMiktari;
   }

   @property void YapGazMiktari(int yuklenecekGazMiktari)
   {
       assert((yuklenecekGazMiktari >= 0) && (yuklenecekGazMiktari < 10_000),
                                         "Geçersiz gaz miktarı [0..10_000]");

       _mevcutGazMiktari = yuklenecekGazMiktari;
   }
}

Daha önce yazdığım gibi spawn() işlevine başka bir sınıftaki işlevi çalıştırması emredilemiyor. Yukarıda bir kaç bir şey daha denedim ama olmadı. Sanki sağ kulağımızı sol elimiz ile tutmaya benziyor. Yoksa iş parçacığını (thread) sınıf içinde mi oluşturacağız?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 12, 2012

Eline sağlık Salih düzenlemeler güzel olmuş

Alıntı (Salih Dinçer):

>

Daha önce yazdığım gibi spawn() işlevine başka bir sınıftaki işlevi çalıştırması emredilemiyor.

Doğrusunu söylemek gerekirse sıkıntıyı şimdi anladım. spawn() sadece bir metodu parametre olarak alıp ayrı bir kanalda çalıştırıyor.

Bu konuyu şimdi bende merak ettim biraz araştırayım. Kanallar konusunda benimde çok bilgim yok. Belki tasarımdan kaynaklanan bir sıkıntımız olabilir diyorum. Acaba fırın gerçekten ayrı bir kanalda mı çalışmalı?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 12, 2012

Kısmen sorunu hallettim amma

  • yine ve
  • hala ve
  • nasıl ve
  • niçin ve
  • neden pizzayı pişeremiyorum !!!

Halbuki ben hem sakız çiğneyip hem de yürüyebiliyorum...:D
Bilgisayarlar da aynı anda birden fazla iş parçacığını yürütebiliyor...:)

/**
* Firin.d
*
* Firin sinifi tarihçesi
*   + VerGazMiktari() metodu eklendi.
*   + YazGazMiktari() metodu eklendi.
*   * Fırının yakılması sırasında harcanmayan gaz miktarı hatası düzeltildi.
*   * IsBitisSuresi() -> IsBitisSuresiKadarBekle() olarak değiştirildi.
*   * IsBitisSuresiKadarBekle() metot parametre tipi ve adı değiştirldi.
*   * IsBitisSuresiKadarBekle() yerine xBekle() işlevi eklendi.
*   * Bazı satırlar 80 karakter genişlik için ikiye bölündü.
*   * enum Hamuru {} sınıf içine alındı...
*   * enum Durumu {} oluluşturuldu
*   * Bazı yazım hataları giderilerek kullanılmayan işlevler kaldırıldı
*   * Firini.yak() işlevi cast(Hamuru) xFark ile çalışacak şekilde ayarlandı
*   * Firini.ver() işlevi tüm olayın kopyası olmasına rağmen çalışmıyor!!!
*   * Nedennnnnnnn...:)
* Derleyici : Digital Mars D (v2.058)
* Son Düzenleme : 12/04/2012
*/

import std.stdio;
import std.concurrency;
import std.exception;
import core.thread;

void main()
{
   writefln("Firin pisirme icin calistiriliyor ...");

   Firin pizzaFirini = new Firin(5000, 200, Firin.Hamuru.ince);
   Firin.Durumu xFark = Firin.Durumu.Çalışmıyor;
/*
   while (xFark > -1) {
       writeln(xFark);
       xFark--;
   }//**TEST**/
   //spawn(&exec, pizaFirini.temsilci);/*
   pizzaFirini.yak();//*/

   do if (xFark != pizzaFirini.durumu)
   {
       writefln(" - Gaz miktari : %s birim", pizzaFirini.VerGazMiktari);
       xFark = pizzaFirini.durumu;
   } while (xFark != Firin.Durumu.Soğuyor);

   writeln("Firin pisirmeye hazir.\n");
   writefln("Firin sicakligi : %s derece", pizzaFirini.VerFirinSicakligi);

   pizzaFirini.yak();//ver(); // NE HİKMETSE ÇALIŞMIYOR!!!

   do if (xFark != pizzaFirini.durumu)
   {
       writefln(" - Pişme durumu : %s", pizzaFirini.durumu);
       xFark = pizzaFirini.durumu;
   } while (xFark != Firin.Durumu.Soğuyor);

   writeln("Fırın artık soğuyorsa pizza pişmiş hatta yenmiş olabilir...:)");
}

class Firin
{
   // 0..300 birim sıcaklık arasında çalışır.
   private int _firinSicakligi = 0;
   // 0..10_000 birim gaz depolanabilir.
   private int _mevcutGazMiktari = 0;

   public Durumu durumu;
   public Hamuru hamuru;

enum Durumu
{
   Soğuyor = -1,
   Çalışmıyor,
   Çalışıyor,
   Isınıyor,
   Isındı,
   Pişiyor,
   Pişti
}

enum Hamuru
{
   ince = 1,   // En çok sevdiğim :)
   orta,
   kalın
}

   //void delegate() temsilci;

   public this(int yuklenecekGazMiktari, int yeniSicaklikDegeri, Hamuru hamurKalınlığı)
   {
       this.YapGazMiktari(yuklenecekGazMiktari);
       this.YapFirinSicakligi(yeniSicaklikDegeri);
       //this.temsilci = &FiriniYakSicakligiAyarla;
       this.durumu = Durumu.Çalışmıyor;
       this.hamuru = hamurKalınlığı;
   }

   public void yak()
   {
       auto tYak = new Thread(&FiriniYakSicakligiAyarla);
       tYak.start();
       ++durumu;// = Durumu.Çalışıyor;
   }
   public void ver()
   {
       //if(durumu == Durumu.Soğuyor) {
           auto tVer = new Thread(&PizzayiFirinaVer);
           tVer.start();
           durumu = Durumu.Isınıyor;
       //} else durumu = Durumu.Çalışıyor;
   }


   private void FiriniYakSicakligiAyarla()
   {
       // Her 1 birim sıcaklık için 5 birim gaz yakar.
       int harcananGazMiktari = _firinSicakligi * 5;

       assert(harcananGazMiktari < _mevcutGazMiktari,
                  "Firindaki gaz miktari yetersiz.");

       _mevcutGazMiktari = _mevcutGazMiktari - harcananGazMiktari;

       // Fırının ısınması 10 saniye sürer.
       ++durumu;// = Durumu.Isınıyor;
       xSnBekle(10);
       ++durumu;// = Durumu.Isındı;
       xSnBekle(5);
       durumu = Durumu.Soğuyor; // Fırını bekleme döngsünden çıkart...
   }

   private void PizzayiFirinaVer()
   {
       assert(_firinSicakligi == 0,
      "Firin sicakligi yetersiz.");

       ++durumu;// = Durumu.Isındı;

       if (_firinSicakligi > 0)
       {
           final switch (hamuru)
           {
               case Hamuru.ince :
                   _mevcutGazMiktari -= 2;  // Pişirme için harcanan gaz
                   break;

               case Hamuru.orta :
                   _mevcutGazMiktari -= 3;
                   break;

               case Hamuru.kalın :
                   _mevcutGazMiktari -= 4;
                   break;
           }

           //Piza pişiyor..
           ++durumu;// = Durumu.Pişiyor;
           xSnBekle(10);
           ++durumu;// = Durumu.Pişti;
           xSnBekle(5);
           durumu = Durumu.Soğuyor; // Fırını bekleme döngsünden çıkart...
       }
   }

   public void xSnBekle(int xSaniye)
   {
       Thread.sleep(dur!("seconds")(xSaniye));
   }

   @property int VerFirinSicakligi() const
   {
       return _firinSicakligi;
   }

   @property void YapFirinSicakligi(int yeniSicaklikDegeri)
   {
       enforce((yeniSicaklikDegeri >= 0) && (yeniSicaklikDegeri < 300),
                                  "Geçersiz fırın sıcaklığı [0..300]");

       _firinSicakligi = yeniSicaklikDegeri;
   }

   @property int VerGazMiktari() const
   {
       return _mevcutGazMiktari;
   }

   @property void YapGazMiktari(int yuklenecekGazMiktari)
   {
       assert((yuklenecekGazMiktari >= 0) && (yuklenecekGazMiktari < 10_000),
                                         "Geçersiz gaz miktarı [0..10_000]");

       _mevcutGazMiktari = yuklenecekGazMiktari;
   }
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 12, 2012

Alıntı (Salih Dinçer):

>

...neden pizzayı pişeremiyorum !!!
Artık pizza da pişiyor...:)

-release parametresi ile derleyince takılıp kalmıyor. Meğer şu satır iş parçacığını tıkıyormuş:

assert(_firinSicakligi == 0, "Firin sicakligi yetersiz.");

Biraz ara verince iyi oluyor. Sabah kafam hata arıyordu ama bir çok şeyi denememe rağmen bulamamıştım. Meğer asortik (assert) bir sorunmuş...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 12, 2012

Alıntı (Salih Dinçer):

>

şu satır iş parçacığını tıkıyormuş:

> assert(_firinSicakligi == 0, "Firin sicakligi yetersiz.");
> ```

>

Tıkıyormuş değil de sonlandırıyormuş yani, değil mi?

Kendimi suçlu hissediyorum çünkü iş parçacıkları diğer iş parçacığının sonlanmasından da haberdar olabiliyor ama ben bunların hiçbirisini o bölüme yazmamışım. :( Eş Zamanlı Programlama bölümünü oldukça genişletilmiş olarak bu akşam ekleyeceğim.

Konuyla ilgili bir alıntı:

Alıntı:
>
> **OwnerTerminated hatası**
> "Sahip sonlandı" anlamına gelen bu hata işçinin bu durumdan haberinin olmasını sağlar. Aşağıdaki programdaki aracı iş parçası iki mesaj gönderdikten sonra sonlanıyor. Bunun sonucunda işçi tarafta bir OwnerTerminated hatası atılıyor:
>
>
>

import std.stdio;
import std.concurrency;

void main()
{
spawn(&aracıİşlev);
}

void aracıİşlev()
{
auto işçi = spawn(&işçiİşlev);
işçi.send(1);
işçi.send(2);
} // ← İki mesajdan sonra sonlanıyor.

void işçiİşlev()
{
while (true) {
auto mesaj = receiveOnly!int(); // ← Sahip sonlanmışsa
// hata atılır.
writeln("Mesaj: ", mesaj);
}
}

>

Çıktısı:

'Mesaj: 1
Mesaj: 2
std.concurrency.OwnerTerminated@std/concurrency.d(248):
Owner terminated
'

İstendiğinde o hata işçi tarafından yakalanabilir ve böylece işçinin de hatasız olarak sonlanması sağlanabilir:

> void işçiİşlev()
> {
>     bool devam_mı = true;
>
>     while (devam_mı) {
>         try {
>             auto mesaj = receiveOnly!int();
>             writeln("Mesaj: ", mesaj);
>
>         } catch (OwnerTerminated hata) {
>             writeln("Sahibim sonlanmış.");
>             devam_mı = false;
>         }
>     }
> }
> ```

>
> Çıktısı:
>
> 'Mesaj: 1
> Mesaj: 2
> Sahibim sonlanmış.
> '
>
> **LinkTerminated hatası**
>
> spawnLinked() ile başlatılmış olan bir iş parçacığı sonlandığında sahibin tarafında LinkTerminated hatası atılır. spawnLinked() de spawn() gibi kullanılır:
>
>
>

import std.stdio;
import std.concurrency;

void main()
{
auto işçi = spawnLinked(&işçiİşlev, thisTid);

while (true) {
    auto mesaj = receiveOnly!int(); // ← İşçi sonlanmışsa
                                    //   hata atılır.
    writeln("Mesaj: ", mesaj);
}

}

void işçiİşlev(Tid sahip)
{
sahip.send(10);
sahip.send(20);
} // ← İki mesajdan sonra sonlanıyor.

>

İşçi yalnızca iki mesaj gönderdikten sonra sonlanıyor. İşçisini spawnLinked() ile başlatmış olduğu için sahip bu durumu bir LinkTerminated hatası ile öğrenir:

'Mesaj: 10
Mesaj: 20
std.concurrency.LinkTerminated@std/concurrency.d(263):
Link terminated
'

OwnerTerminated hatasında olduğu gibi bu hata da yakalanabilir ve sahip de bu durumda düzenli olarak sonlanabilir:

>     bool devam_mı = true;
>
>     while (devam_mı) {
>         try {
>             auto mesaj = receiveOnly!int();
>             writeln("Mesaj: ", mesaj);
>
>         } catch (LinkTerminated hata) {
>             writeln("İşçi sonlanmış.");
>             devam_mı = false;
>         }
>     }
> ```

>
> Çıktısı:
>
> 'Mesaj: 10
> Mesaj: 20
> İşçi sonlanmış.
> '

Ali

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
April 14, 2012

Alıntı (acehreli:1334253879):

>

Alıntı (Salih Dinçer):

>

şu satır iş parçacığını tıkıyormuş:

> > assert(_firinSicakligi == 0, "Firin sicakligi yetersiz.");
> > ```

> >
>
> Tıkıyormuş değil de sonlandırıyormuş yani, değil mi?
Vallahi hocam sen daha iyi bilirsin. Ama herhangi bir hata iletisi almadım. Yani bizim şu yukarıdaki satırda yazdığımız "Firin sicakligi yetersiz." ifadesi ekrana gelmeyip öyle takılıp kalıyor.

Alıntı (acehreli:1334253879):
> Kendimi suçlu hissediyorum çünkü iş parçacıkları diğer iş parçacığının sonlanmasından da haberdar olabiliyor ama ben bunların hiçbirisini o bölüme yazmamışım. :(
Estağfurullah hocam, suçlu hissetmek ne kelime. Henüz kitaba tek bir kelime bile katkı sağlayamadığımız için bizim suçlu hissetmemiz lazım. Bugüne kadar yazdıkların ile sadece D'ye değil programcılığa yeni başlayan bir çok kardeşimize yol göstermiş oluyorsun ki eş zamanlı programlama ile son noktarları koyuyorsun gibime geliyor...:)

Bakalım ömrümüz içinde bizleri daha ne yenilikler bekliyor! Belki bir gün Turing'in hayal ettiği gibi algoritmayı okurken öğrenen ve kendi algoritmasını yapan bilgisayarlar yapacağız. Şimdi yapay zeka savunucuları hemen itiraz edecekler. Bence yapay zeka henüz emeklemeyi öğrenmeyi başaramamış bir bebek. Belki de böyle olması iyi yoksa bir gün Matrix ve Terminator gibi filmler gerçek olabilir...:)

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
April 14, 2012

Alıntı:

>

Ali
Kendimi suçlu hissediyorum çünkü iş parçacıkları diğer iş parçacığının sonlanmasından da haberdar olabiliyor ama ben bunların hiçbirisini o bölüme yazmamışım

Salih'in denemeleri ve sizin bu öngörünüz sayesinde eş zamanlı programlama konusu çeşitlendiği, kapsamı genişlediği ve zenginleşmesi aslında hoş.

Ortaya konan bilgi dökümanı eşine nadir sastlanılan cinsten.

Teşekkürlerimle

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

1 2 3
Next ›   Last »