proc / func çağrıları hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

proc / func çağrıları hakkında

Mesaj gönderen anonymousdelphicoder »

Merhabalar,

Sorum şu, örneğin 150 Milisaniyede bir çalışan Timer nesnesinin olduğunu düşünün, bu timer nesnesi her işlediğinde XYZ procedure'ünü çağıracak fakat burada önemli nokta şu, procedure çağırma zamanı 150 MS olmasına karşın çağrılan XYZ nin işini bitirmesi 300 MS yani XYZ nin CPU Time 300 MS sürüyor.
Her 150 MS de çağrılan XYZ, 300 MS de bitiyorsa 300 Milisaniye'nin 150.ci Milisaniyesi'nde yeni bir XYZ çalışmış oluyor,300 Milisaniyenin 300.Milisaniyesinde hem bu XYZ işini bitirmiş oluyor, hem diğer XYZ 150. Milisaniyesini tamamlamış oluyor hemde yeni bir XYZ çalıştırılmış oluyor, buda şu demek oluyor aynı anda 2 tane XYZ çalışmış oluyor...

Benim burada merak ettiğim kodların senkronizasyonu değil, yani birbirini beklemesi değil bunları senkronizasyon mekanizmalarıyla halledebiliriz,
(**fakat bu kodlar main thread'da çalışmış olsaydı senkronizasyon mekanizmalarını kullanabilirmiydik emin değilim bir keresinde sorun yaşamıştım...)


Burada Delphi,C++,C veya başka native bir dil fark etmiyor, bu diller aynı anda iki procedure'yi / function'ı nasıl çalıştırıyor, nasıl idare ediyor, aynı anda çalışan XYZ nin farklı pointer adreslerimi oluyor ? veya bu procedure veya function kodlarını kopyalayıp ayrı bir yerde mi çalıştırıyor ?, ayrıca aynı anda dediğime lütfen aldanmayın, tek çekirdekli bir pc'de işlemler gözümüze sadece eş zamanlıymış gibi geliyor fakat sonuç itibariyle, 2 tane XYZ eş zamanlıymış gibi çalışıyor, önce 1. XYZ sonra 2.XYZ çalışsada aynı zaman içinde çalışmış oluyorlar...


inşAllah anlatabilmişimdir, bilgi eksikliğim olduğundan soruyu sorma biçimi açısından sizi yormuş olabilirim kusura bakmayınız lütfen, bir ricam da konu hakkında bilgi sahibi olanlar yazabilirse hem ben hem diğer insanlar bilgi kirliliği olmadan faydalanmış olurlar...


Teşekkürler.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: proc / func çağrıları hakkında

Mesaj gönderen freeman35 »

OOP de class bir kez memory ye alınır, sonrakilerde değişkenler private is çoğaltılır. (Bu tanımlar genel, yani koşula vs gibi detyalara göre değişcektir.sadece böyle çalışır anlamında demiyorum) theread ler class ve create ediyorsun ona bir blok yarılıyor. Her 150ms de bir thread create edersen ve bunların işi 300 veya daha fazla ise bu işlem süresince blok bekler ve orası çalıştırılır. ama bunun içine yazdığın kodlar, kullandığın değişkenler vs tamamen tasarıma bağlı. Ana thread içinde bir global değişken var ve bu 150ms de açılan thread ler bu değişkeni kullanıyorlarsa tasarıma bağlı olarak ortalık karışabilir. thread leri bağımsız çalışan uygulamalar gibi düşünmek, tasarımı ve kurgulamayı kolaylaştırabilir.
cpu çekirdekleri de herbir uygulama bir çekirdeği kullanabilir düşüncesi yanlış. işlemci procedure ada function ı yazdığınız gibi çalıştırmaz, o kodu assembly gibi düşünün ki zaten derleyici o hale getiriyor, o gördüğünüz herbir satır (assembly a çevrilmiş olan) cpu üzerinde onlarca işleme denk gelir. bir atama dahi, memoryden bilgi al tekrar gönder vs akla zarar işler :)
OOP konusu forumda daha önceleri anlatılmıştı, o kısımları okumanızı tavsiye ederim. Öğrenilmesi gereken, delphi bir dil değildir, pascal dır. PASCAL ı öğrenmeniz gerek. O zaman program yazarken zorlanmazsınız.
"Grid kaydetmiyor" tarzı soru soranların progmcıyım demeleri beni hep üzmüştür. IDE ler sayesinde tek satır kod yazmadan drag & drop ile bir ticari program yazmak mümkün olunca, kimsede "NASIL ?" diye araştırmadan program yazıyorum diyor.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
The_aLiEn
Üye
Mesajlar: 28
Kayıt: 09 Kas 2010 02:35
Konum: Trabzon
İletişim:

Re: proc / func çağrıları hakkında

Mesaj gönderen The_aLiEn »

Öncelikle bir fonksiyon/prosedür, daha genel adıyla bir metod nasıl çalışır önce bunu iyi anlamak gerekiyor.

Derleme aşamasında metodlar program dosyasının bir yerine yerleştirilir ve bu metod kod içerisinde her çağırıldığı yerde buraya adreslenir.

Metod çağırılacağı zaman, içinde bulunulan mevcut bir başka metodun (caller) tüm parametreleri ve ihtiyaç olan diğer bilgiler (EIP mesela, detaylara inmiyorum) stack a itilir. Çağırılacak metodun (callee) parametreleri stack a itilir ve metod çağrımı yapılır. Bir başka metod çağrımı yapılacağı zaman da aynı işlemler yapılır. Scope değişiyor aslında. Callee olan bir metod, bir başka anda bir başka metod çağırdığında caller olur..

Timer demişsin, senkronizasyon demişsin.. Çok başka şeyler bunlar. En önemli bilgi, timer nesnesinin pencere mesajları ile çalıştığını ve main thread içinde çalıştığını bilmek gerekiyor. 150ms de bir timer ın metodu çalışmaz, mesaj kuyruğuna bir timer mesajı bırakılır. Kuyruktaki sırası geldiğinde bu mesaj işlenir.

Bazı şeylerin uçlarını açık bıraktım, farkındasınızdır. Sorunun tüm cevapları yukarıdaki kilit cümlelerden çıkartılabilir ;)

İyi çalışmalar, iyi akşamlar..
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: proc / func çağrıları hakkında

Mesaj gönderen anonymousdelphicoder »

The_aLiEn yazdı: Bazı şeylerin uçlarını açık bıraktım, farkındasınızdır. Sorunun tüm cevapları yukarıdaki kilit cümlelerden çıkartılabilir ;)
Teşekkürler gayet iyi anladım, yazdıklarınızdan, uclarının epey açık olduğu belli oluyor zaten :D

Evet TTimer dediğiniz gibi ileti tabanlı bir zamanlayıcı, açıkladıklarınızdan yeni bilgiler edinme şansım oldu bunun için ayrıca teşekkür ediyorum,

TTimer değilde Thread tabanlı bir zamanlayıcı yazdım tetiklemeyi bu yapıyor, Thread tabanlı yazmamın sebebide TTimer'in Thread safe olmamasından dolayı...

Şimdi 150 Milisaniye süreye ayarlanmış Thread tabanlı bir zamanlayıcıyım var, buradaki zaman gecikmeleri pek önemli değil (OS'un Thread'ları yönetme algoritmalarından doğan gecikmelerden bahsediyorum bu yüzden 150 Ms 170 180 civarlarınıda bulabilir mühim değil)

Önemli detay, Thread Zamanlayıcı tetiklemeyi, Synchronoize veya Queue methodlarıyla yapmıyor, Synchronoize ile yapsaydı ilgili kodun MainThread'da çalışıp dönmesini beklerdi, böylece her method sıralı şekilde çalışmış olurdu, Queue ile yapsam MainThread'a kuyruklar ve doğrudan zamanlayıcı devam ederdi. Bu bağlamda benim Zamanlayıcı Thread'ım kendi içinden süresi tamamlanınca bir eventi çağrıyor o Event ise Anonymous bir thread yaratıyor bu yüzden zamanlayıcı Thread'ım beklemeden yine devam ediyor, çünkü AnonymousThread create edildiğinden bloklama işlemi olmamış oluyor..


"***Bu Noktada Mühim olan asıl sormak istediğim***" Zamanlayıcı Thread'ın Tick olmasıyla yeni bir AnonymousThread oluşuyor ve bu AnonyMousThread içindeki kodlar kesinlikle Global nesnelere erişmiyor bu bağlamda sorun yok, Anonymous olan Thread hep aynı procedürü çağırdığı için

ilk başlayan AnonymousThread dediğim gibi 300 Ms, de tamamlanıyor ama Zamanlayıcı Thread bu süre zarfı içinde başka bir Anonythread'ı oluşturuyor ve aynı procedürü çağırıyor, sonuç olarak biri görevini daha bitirmemişken diğeride çalışıyor, bunlar tek çekirdekli işlemci de çalışmış olsaydı OS'un algoritmasına göre her biri belli bir süre çalışacaktı, birden fazla çekirdekli işlemcide ise gerçek zamanda bunların ayrı iki çekirdek tarafından çalıştırılması mümkün, bu durumlarda procedure nasıl çalışıyor, özellikle tek çekirdekli işlemcide sıralı olarak çalıştırıldığı için her sırada sanırım OS tarafından bunların nerede kaldığı biliniyor, değerler ona göre yeniden yükleniyor (???) birden fazla çekirdeğe sahip bir işlemcide ise diyelim ki iki thread farklı 2 çekirdekte çalışıyor, bu prosedür nasıl yönetiliyor...

inan ağbi yazarken çok yoruldum :D
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: proc / func çağrıları hakkında

Mesaj gönderen anonymousdelphicoder »

İlginiz için teşekkür ederim @freeman35
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: proc / func çağrıları hakkında

Mesaj gönderen kimimben »

Merhaba
The_aLiEn yazdı: Derleme aşamasında metodlar program dosyasının bir yerine yerleştirilir ve bu metod kod içerisinde her çağırıldığı yerde buraya adreslenir.
Derleme birden fazla aşamadan meydana geliyor.Bu methodların adreslerini yerleştirme işlemini linker'mı yapıyor ?
The_aLiEn yazdı: Metod çağırılacağı zaman, içinde bulunulan mevcut bir başka metodun (caller) tüm parametreleri ve ihtiyaç olan diğer bilgiler (EIP mesela, detaylara inmiyorum) stack a itilir. Çağırılacak metodun (callee) parametreleri stack a itilir ve metod çağrımı yapılır. Bir başka metod çağrımı yapılacağı zaman da aynı işlemler yapılır. Scope değişiyor aslında. Callee olan bir metod, bir başka anda bir başka metod çağırdığında caller olur..
Burada bahsettiğniz scope aslında stack frame kavramını ifade ediyor.Yani yazdığımı her method için ayrı bir stack frame açılıyor. Doğru mu anladım ?
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: proc / func çağrıları hakkında

Mesaj gönderen kimimben »

freeman35 yazdı:OOP de class bir kez memory ye alınır, sonrakilerde değişkenler private is çoğaltılır. (Bu tanımlar genel, yani koşula vs gibi detyalara göre değişcektir.sadece böyle çalışır anlamında demiyorum) theread ler class ve create ediyorsun ona bir blok yarılıyor..
Access modifiers ile allocation arasında nasıl bir ilişki kurduğunuzu anlayamadım.
freeman35 yazdı:OOP konusu forumda daha önceleri anlatılmıştı, o kısımları okumanızı tavsiye ederim. Öğrenilmesi gereken, delphi bir dil değildir, pascal dır. PASCAL ı öğrenmeniz gerek. O zaman program yazarken zorlanmazsınız.
"Grid kaydetmiyor" tarzı soru soranların progmcıyım demeleri beni hep üzmüştür. IDE ler sayesinde tek satır kod yazmadan drag & drop ile bir ticari program yazmak mümkün olunca, kimsede "NASIL ?" diye araştırmadan program yazıyorum diyor.
OOP konusunu pascal'ı öğrendiğimizde fonksiyon ve procedure kavramlarının arkaplanda nasıl çalıştığını anlamış olurmuyuz ?
Kullanıcı avatarı
The_aLiEn
Üye
Mesajlar: 28
Kayıt: 09 Kas 2010 02:35
Konum: Trabzon
İletişim:

Re: proc / func çağrıları hakkında

Mesaj gönderen The_aLiEn »

Merhaba
kimimben yazdı:Merhaba
Derleme birden fazla aşamadan meydana geliyor.Bu methodların adreslerini yerleştirme işlemini linker'mı yapıyor ?
Evet bahsettiğiniz yer linking aşaması; bu işlemi linker gerçekleştirir.
kimimben yazdı:Burada bahsettiğniz scope aslında stack frame kavramını ifade ediyor.Yani yazdığımı her method için ayrı bir stack frame açılıyor. Doğru mu anladım ?
Ben doğru anladıysam şöyle düzelteyim; derleme aşamasında stack frame kavramı yoktur. Stack frame runtime da geçerli olan bir şeydir. Dolayısıyla aslında yazılan her bir metod için bir stack frame değil, her bir metod çağrımı için bir stack frame vardır. Aynı metodu da çağırsanız birkaç defa hepsinin stack frame i ayrı olacaktır.
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: proc / func çağrıları hakkında

Mesaj gönderen kimimben »

The_aLiEn yazdı:
kimimben yazdı:Burada bahsettiğniz scope aslında stack frame kavramını ifade ediyor.Yani yazdığımı her method için ayrı bir stack frame açılıyor. Doğru mu anladım ?
Ben doğru anladıysam şöyle düzelteyim; derleme aşamasında stack frame kavramı yoktur. Stack frame runtime da geçerli olan bir şeydir. Dolayısıyla aslında yazılan her bir metod için bir stack frame değil, her bir metod çağrımı için bir stack frame vardır. Aynı metodu da çağırsanız birkaç defa hepsinin stack frame i ayrı olacaktır.
Evet aslında bende run time'da ki durumu kast etmiştim.Ama yanlış ifade etmiş olabilirim.
İlgilendiğiniz için teşekkürler.
Kullanıcı avatarı
The_aLiEn
Üye
Mesajlar: 28
Kayıt: 09 Kas 2010 02:35
Konum: Trabzon
İletişim:

Re: proc / func çağrıları hakkında

Mesaj gönderen The_aLiEn »

kimimben yazdı:Evet aslında bende run time'da ki durumu kast etmiştim.Ama yanlış ifade etmiş olabilirim.
İlgilendiğiniz için teşekkürler.
Rica ederim. İyi çalışmalar.
Cevapla