Challenge ! (Meydan Okuma)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen mrmarman »

Ben cevabı vermedim, yaklaşımım hatalı hatta. Bu hata da başka bir ipucu oldu.
Resim
Resim ....Resim
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen G.Arkas »

@mrmarman :lol:

Async/Sync IO methodu C ve C++ dillerinde var. Sadettin hocamın paylaştığı yerde de örneği var aslında. Delphi de bunu TStream sınıfını kullanarak yapmamız gerekmekte.
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen thelvaci »

G.Arkas yazdı:Harika bir şey yaptınız Tuğrul hocam. Konu çok şahane.

Muharrem abi ipucu yerine direk cevabı vermiş ama olmaz ki. :oops:

Bir ara lazım olduğundan MemoryMappedFile kullanmıştım. Sanırım buradan yola çıkabilirim. Ama emin değilim. Dosyayı Memory'de oluştursam işlem bittikten sonra fiziksel olarak kaydetsem olur mu?
Birinci amaç, dosya oluşturmak değil aslında. Esas amaç yapılan hiç bir işlemin ana thread'i bloklamaması ;) Biraz daha açıklama yapar isem ciddi ipucu vermiş olacağım, ama @Sadettin'in mesajındaki linki inceleyebilirsiniz bence ;)

Ayrıca belirtelim, muharrem bey cevabı yazmak için yapmadı o paylaşımı; nedenini kendisi daha iyi izah eder ama konu korkutucu olmasın bir yerlerden başlansın araştırılmaya diye yazdı ;) Dolayısı ile çözüm o değil, TFileStream vb. ile yaparsanız ana thread'iniz bloklanır.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen G.Arkas »

Bende agzinzdan laf alayim diye yemledim ama olmadi :) tesekkurler hocam
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen thelvaci »

thelvaci yazdı:Bazı yabancı sitelerde görmüşsünüzdür; challenge (meydan okuma) başlıkları altında programcıların eğlenmek, eğlenirken öğrenmek için yarışma havasındaki paylaşımları olur. Ben de araştırmayı seven arkadaşlarım için bir challenge açmak istedim burada.

Konu: 1 GB boyutunda bir dosya açılacak ve bu dosyanın içi 123456789 sayıları ile doldurulacak. Ardından dosyadaki her 123456789 ters çevrilip 987654321 olarak kaydedilecek.

Kısıtlar:
1- Uygulamanın ana thread'inden başka thread kullanılamaz. (CreateThread yada TThread sınıfını kullanmak yasak)
2- Uygulama tüm bu işlemleri yaparken responsive durumda olacak, yani kilitlenme yaşanmayacak. (İşlemleri bir başka thread'de yapıyormuşuz gibi)
3- Kullanıcı işlemi istediği an sonlandırabilecek.

Gerekir ise ipucu verilebilir fazla olmamak kaydı ile ;)

Yukarıdaki challange için ise; bahse konu dosyayı oluşturmak için CreateFile API'sini dwFlagsAndAttributes parametresine FILE_FLAG_OVERLAPPED geçerek çağırmalısınız. Bu şekilde ki kullanım ile; ilgili dosya üzerindeki işlemlerin asenkron olarak yapılacağını söylemiş olursunuz. OVERLAPPED yapısına bir göz atmanız faydalı olacaktır elbette. Ardından dosyaya yazma ve dosyadan okuma yapabilmek için; ReadFile ve WriteFile API'lerini kullanmanız gerekiyor. Bu API'ler hem senkron hem de asenkron yazma ve okuma işlemlerini yapabilme yeteneğine sahiptirler. Bu API'lerin asenkron yazma ve okuma yapabilmeleri için lpOverlapped isimli parametrelerinin düzgün bir OVERLAPPED yapısı ile doldurulması gerekir. Eğer bu parametre boş geçilir ise ilgili API'ler senkron çalışırlar, asenkron değil! Ayrıca, bu API'lerin kardeş API'leri olan ReadFileEx ve WriteFileEx API'lerini de kullanabilirsiniz, bu API'ler asenkron çalışırlar.

Dosya üzerinde hareket edebilmek için SetFilePointer yada SetFilePointerEx API'sini kullanabilirsiniz. Dosyanın tamı tamına 1 GB olmasını istemiştik, bunu da SetEndOfFile API'si yardımı ile yapabilirsiniz.

Ayrıca asenkron olarak kernel'a iletilen isteklerin tamamlanıp tamamlanmadığını arasıra kontrol etmeniz ve işlemeniz gerekir. Bunu yapabilmek için WriteFileEx, ReadFileEx içinde tanımlı olan callback metodunu kullanabileceğiniz gibi; WriteFile/ReadFile kullanıyor iseniz GetOverlappedResult ya da GetOverlappedResultEx API'lerini de kullanabilirsiniz. Bu metodların dönüş değerlerinin kontrol etmeyi de unutmamalısınız.

Alertable durum nedir kısmını merak ediyor iseniz; biraz araştırma yapmanız gerekecek yada Challange 2 de bahsettiğim kısa açıklamayı okuyabilirsiniz başlangıç olarak. Elbette bir thread'i alertable duruma sokarsanız; alertable bekleme yapabilen API'leri de araştırmanızda fayda olacaktır.(WaitForSingleObjectEx, SleepEx vb.)

Aynı zamanda kullanıcının süregelen asenkron iletişimi sonlandırabilmesini de istemiştik. Bunun için; CancelIo ya da CancelIoEx API'lerini kullanabilirsiniz.

Asenkron işlemi kullanıcının sonlandırma isteğinde; mevcut asenkron paketlerinin hepsini CancelIo/CancelIoEx ile sonlandırdıktan sonra QueueUserAPC API'sini kullanmak faydalı olacaktır.

Ayrıca belirtmek isterim ki; herşeyi düzgün uygulasanız da; bazen sonuçlar asenkron değil senkron dönebilir. Bunun nedeni işletim sisteminin sürekli disk'e erişim işlemi yapmak istememesi ve sık kullanılan dosyaların sık kullanılan bloklarını cache'lemesinden kaynaklanır. ReadFile/Ex API'si isteği alan kernel, istenen parçanın cache'de olduğunu görür ise bu durumda işlem asenkron değil, senkron olarak gerçekleşir. Bu nedenle; ReadFile/WriteFile API'lerinin dönüş değerlerini iyi kontrol etmelisiniz.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen SimaWB »

Diğer "Meydan Okuma"lara da cevaben hepsini buraya yazıyorum:
Tuğrul Bey; foruma böyle bir renk katma düşünceniz harikay. Di'li geçmiş zaman kullandım çünkü diğer "meydan okuma" cevabınızı üzülerek okudum. Çok çabuk kırılmışsınız :)
Kendi adıma zaten zamanlama konusundaki rahatsızlığımı dile getirmiştim. Tam "Tatil başladı. Hadi biraz vakit geçirecek birşeyler bulalım, vakit geçirirken de birilerine yardımcı olabilirsek ooohhh tadından yenmez" diye düşünüp foruma girdim ki sizin cevaplarınızı gördüm :(

Bence diğer sorulardaki sitem dolu cevabınızda haklısınız(özellikle armudun pişmesi ile alakalı). Ama en azından bu haftaki uzuuuuuun tatili göz önünde bulundurmalıydınız. Ben cevabı az-çok bildiğim halde toparlayıp cevap yazacak vakti bulamamışken, işinden arda kalan vakitte birilerinin bunları araştırıp, anlayıp, burada cevap verebilmesi için daha fazla zaman verilmeliydi diye düşünüyorum.

Kısacası; bu seferlik darılmaya hakkınız yok :D
Forum yöneticilerinden rica edelim, challenge'lar için ayrı bir bölüm açılsın, oradan sizin önderliğinizde devam edelim. Ama forum başlığı "meydan okuma" olmasın lütfen. Çok korkutucu. Hele hele meydan okuyan Tuğrul Bey olunca kimsenin eli pek klavyeye gitmez sanırım :N)

Bu arada; cevabı biliyorum derken aslında tesadüfen ilgilendiğim bir konu hakkında soru geldiği için şanslı olduğumu belirtmek isterim :) USB'den veri okuyup/yazma işleri ile uğraşırken yaptığım araştırmalarda, bu forumdaki birçok kişinin kullandığını tahmin ettiğim TurboPower Async Pro bileşen kütüphanesinin kaynak kodlarıyla haşır neşir olmuştum. Orada bahsi geçen API'ler bolca kullanılmakta. İlgilenenler kaynak kodları karıştırabilir.

Ben herkesin huzurunda; başta Challenge önderliği olmak üzere, bu forumdaki tüm paylaşımları ve web sitesindeki harika kaynaklar için Tuğrul Bey'e çok teşekkür ediyorum :bravo:
There's no place like 127.0.0.1
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen thelvaci »

SimaWB yazdı:Diğer "Meydan Okuma"lara da cevaben hepsini buraya yazıyorum:
Tuğrul Bey; foruma böyle bir renk katma düşünceniz harikay. Di'li geçmiş zaman kullandım çünkü diğer "meydan okuma" cevabınızı üzülerek okudum. Çok çabuk kırılmışsınız :)
Kendi adıma zaten zamanlama konusundaki rahatsızlığımı dile getirmiştim. Tam "Tatil başladı. Hadi biraz vakit geçirecek birşeyler bulalım, vakit geçirirken de birilerine yardımcı olabilirsek ooohhh tadından yenmez" diye düşünüp foruma girdim ki sizin cevaplarınızı gördüm :(

Bence diğer sorulardaki sitem dolu cevabınızda haklısınız(özellikle armudun pişmesi ile alakalı). Ama en azından bu haftaki uzuuuuuun tatili göz önünde bulundurmalıydınız. Ben cevabı az-çok bildiğim halde toparlayıp cevap yazacak vakti bulamamışken, işinden arda kalan vakitte birilerinin bunları araştırıp, anlayıp, burada cevap verebilmesi için daha fazla zaman verilmeliydi diye düşünüyorum.

Kısacası; bu seferlik darılmaya hakkınız yok :D
Forum yöneticilerinden rica edelim, challenge'lar için ayrı bir bölüm açılsın, oradan sizin önderliğinizde devam edelim. Ama forum başlığı "meydan okuma" olmasın lütfen. Çok korkutucu. Hele hele meydan okuyan Tuğrul Bey olunca kimsenin eli pek klavyeye gitmez sanırım :N)

Bu arada; cevabı biliyorum derken aslında tesadüfen ilgilendiğim bir konu hakkında soru geldiği için şanslı olduğumu belirtmek isterim :) USB'den veri okuyup/yazma işleri ile uğraşırken yaptığım araştırmalarda, bu forumdaki birçok kişinin kullandığını tahmin ettiğim TurboPower Async Pro bileşen kütüphanesinin kaynak kodlarıyla haşır neşir olmuştum. Orada bahsi geçen API'ler bolca kullanılmakta. İlgilenenler kaynak kodları karıştırabilir.

Ben herkesin huzurunda; başta Challenge önderliği olmak üzere, bu forumdaki tüm paylaşımları ve web sitesindeki harika kaynaklar için Tuğrul Bey'e çok teşekkür ediyorum :bravo:
Güzel iltifatlarınıza teşekkürler Veli bey. Konu başlığından, birilerine meydan okuduğum anlaşıldı ise yada öyle bir hissiyat uyandırdı ise; her bir arkadaşımdan özür dilerim öncelikle. Asla böyle bir amacım yada düşüncem olmamıştı. Yabancı sitelerde -daha ziyade, hacking/cracking forumlarında- bu tarz konu başlıkları olur, amaç amiyane tabirimi maruz görürseniz eğer; "biraz gaza getirmektir". Ben de bu amaç ile challange demiştim konu başlığına. Sizin de bahsettiğiniz gibi anlaşıldı ise gerçekten kusura bakmasın tüm arkadaşlarım.

Bu sebeple, lütfen herkes doğru/yanlış, kısmen doğru/kısmen yanlış aklına ne geliyor ise paylaşsın. Tek bir amacım vardı bu işi yaparken; o da araştırmaya dolayısı ile öğrenmeye katkı sağlamak. İşletim sistemi ve Delphi hakkında ama az, ama çok kısmi bir bilgim var. Bu tarz paylaşmak daha eğlenceli olur diye düşünmüştüm. Ancak, konuları 100'ü aşkın insanın okumasına rağmen, çok az arkadaşımızın katılımda bulunmasına içerledim ben.

Eğer biz bu mesleğin erbapları isek, öncelikle mesleğimize saygı duymamız ve öğrenmeye sürekli devam etmemiz gerekir gibi bir inanca sahibim. Bunun aksini görünce de sinirleniyorum istemesemde. Hiçkimse herşeyi bildiğini iddia edemez; eder ise yalan söylemiş olur; benim de bilmediğim milyon tane şey var; bu sebep ile kimseye hava atma derdinde değilim asla.

Ama ben de böyle derin konularda, yada araştırma gerektiren konularda birilerinden birşeyler öğrenme açlığı duyuyorum. Birileri de şöyle detaylıca, etraflıca bilmediğim bir konuyu onlarca sayfa makale halinde yazsa da keyifle okusam/denesem ben de öğrensem diyorum. Tüm özlemim bunadır. Bu konuları açıyorum ki, asenkron programlamaya adımını atan arkadaşım merak edip IOCP'ye geçsin; oradan Vista ile birlikte gelen yeni thread pooling API'lerine geçsin ve keşfettiklerini bizlerle de paylaşsın. Dolayısı ile herşeyi okumaya vakti kalmayan ben de dahil pek çok arkadaşımız yeni bir şeyler öğrenmenin hazzını yaşasın.

Artık bu forumda basit soruların, bir kaç tık ile ulaşılabilecek bilgilerin ağırlıklı olarak yer kaplamamasını arzuluyorum. İçimizden bir yiğit çıksında, hadi Delphi'ye asenkron TStream kazandıralım desin mesela, yada IOCP ile yüzbinlerce bağlantıyı dahi kolayca yönetebilecek bir server application nasıl tasarlanırı tartışalım ve bu konularda fikir ve kod paylaşımlarında bulunalım.

Arzu ediyorum ki burası bir eğitim/öğretim yurdu olsun; çakma google olmasın. Çok mu şey arzu ediyorum ?
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen sadettinpolat »

"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen thelvaci »

sadettinpolat yazdı:bir challenge da David den geldi :)

http://community.embarcadero.com/blogs/ ... es-of-code
Taklitlerimizden sakınınız :)
Cevapla