Challenge 2

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Challenge 2

Mesaj gönderen thelvaci »

Başladık bir kere challenge'lara, durdurabilene aşk olsun :)

Konu: Bir thread'iniz var ve içinde kernel nesnelerinden birisinin bitmesini INFINITE ile bekliyorsunuz(Örneğin bir event'i, semaphoru vs). İstediğiniz herhangi bir anda bu bekleme işleminden nasıl vazgeçersiniz.

Kural:
1- Tek bir kernel nesnesinin bitmesini bekliyor olacaksınız.(Bu sayede sadece çıkış için tetiklenebilecek bir başka kernel nesnesini tetiklemenizin önüne geçilmiş olacak.)
2- Bir döngü içinde herhangi bir değişkenin set edilip edilmediğini kontrol ederek bekleme yapmak ve set edildiğinde çıkmak yasak.
3- Elbette thread içinde beklediğiniz kernel nesnesini tetiklemeniz de yasak :)
4- TerminateThread yasak.
5- GetThreadContext/SetThreadContext eip oynamaları yasak.

Kısaca bir thread'iniz var ve içinde bir kernel nesnesinin işini tamamlaması için sonsuza kadar bekler durumdasınız ve uygulamanızı da düzgün bir şekilde kapatmanız icap ediyor, dolayısı ile o thread'den çıkmanız lazım. Ne yapacaksınız ?
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Challenge 2

Mesaj gönderen SimaWB »

Diğer soru için ipucu olmuş bu :)
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 2

Mesaj gönderen thelvaci »

Hadi biraz da buna beyin fırtınası gerekiyor ;)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 2

Mesaj gönderen thelvaci »

Yok mu fikri olan ;)
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 2

Mesaj gönderen G.Arkas »

@thelvacı hocam ben bununla ilgili bir soru sormuştum size zamanında bilmem hatırlar mısınız :D Çok canımı yakan bir konuydu bu. Zaten bulduğum çözümüde beğenmemiştiniz. Şimdi bunu yine versem sıkıntı olacak benim için :D
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 2

Mesaj gönderen thelvaci »

G.Arkas yazdı:@thelvacı hocam ben bununla ilgili bir soru sormuştum size zamanında bilmem hatırlar mısınız :D Çok canımı yakan bir konuydu bu. Zaten bulduğum çözümüde beğenmemiştiniz. Şimdi bunu yine versem sıkıntı olacak benim için :D
:) Hatırlayamıyorum neden beğenmediğimi ama amacımız beğenmek de değil şu aşamada. Arkadaşlarımızın araştırma hevesi var mı, yok mu; öğrenme istekleri canlı mı değil mi bunu görüyoruz aslında burada. Ve maalesef, sonuç hiç de iç açıcı değil; pek çok insan bakmış, okumuş challange'ları ama kimse bir yorum da bulunmamış, nihai olarak aklımdakileri burada paylaşmak niyetinde idim; ama şu an ondan bile emin değilim.

Bu kadar zor olmamalı idi, bilmiyorsak dahi araştırmak, yahut fikir beyan etmek. Lafım sizin şahsınıza değil elbette; genele. Bu öğrenmeye olan isteksizlik beni çok üzüyor. Herkes; armut pişsin ağzına düşsün istiyor sanıyorum. Oysaki ilk challange hariç diğer ikisi o kadar da zor değildi. Kısacık bir google araştırması dahi ipuçlarını vermeye yetiyordu.

Keşke birileri bu araştırmaları yapmış olsa idi ve "şu değil mi bunun cevabı" diye sorsaydı; ya da, "bu fonksiyon/api olduğunu düşünüyorum ama nasıl kullanıldığını anlayamadım" dese idi; maalesef bunu bile duyamadık/göremedik. "Heves nasıl kırılır ?" sorusunun cevabını her daim alıyorum gerçekten de.

Sırf bu sebepten ötürü çok uzun zamandır sitem de de bir şey paylaşmıyorum; nasılsa kimsenin okuduğu ya da öğrenmek istediği yok. Boş yere emek ve zaman kaybı gibi görünüyor.

"Bilgim az, o sebeple yazmadım, ya doğru değilse diye çekindim!" söylemleri de manasız; amacımız kimseyi mülakata sokmak değil ki, bunu cevaplayamazsanız ya da yanlış bir cevap verirseniz inanın kimse sizi burada ayıplamaz/ayıplayamaz. Bunu yapacak insan da yok zaten burada.

Herneyse velhasıl, "bir dokun bin ah işit" gibi oldu; lütfen kusuruma bakma @G.Arkas. Ama ciddi anlamda hissettiklerim de bunlar. Belki kabullenmek zor ama; "yeni bir şeyler öğrenmek hususunda üşengeçiz, bildiklerimizi paylaşmak anlamında ise bencil..."
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 2

Mesaj gönderen thelvaci »

Cevabı vereyim madem;
WaitForSingleObjectEx API'sinin son parametresi olan bAlertable değerini true olarak verirseniz eğer; WaitForSingleObjectEx API'sinin çağrıldığı thread alertable duruma geçecektir. Ardından bir başka thread'den QueueUserAPC API'si vasıtası ile alertable durumda olan thread'in alertable kuyruğuna mesaj bırakabilirsiniz. Bu durum gerçekleştiğince; WaitForSingleObjectEx API'sinden dönüş değeri olarak WAIT_IO_COMPLETION alacaksınız. Deneme kodları da size ait.

Not: Bir thread'i alertable duruma sokan pek çok API vardır, merak ederseniz onları da araştırabilirsiniz. Bunlardan en basit olanı ise SleepEx API'sidir.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 2

Mesaj gönderen G.Arkas »

thelvaci yazdı:
G.Arkas yazdı:@thelvacı hocam ben bununla ilgili bir soru sormuştum size zamanında bilmem hatırlar mısınız :D Çok canımı yakan bir konuydu bu. Zaten bulduğum çözümüde beğenmemiştiniz. Şimdi bunu yine versem sıkıntı olacak benim için :D
:) Hatırlayamıyorum neden beğenmediğimi ama amacımız beğenmek de değil şu aşamada. Arkadaşlarımızın araştırma hevesi var mı, yok mu; öğrenme istekleri canlı mı değil mi bunu görüyoruz aslında burada. Ve maalesef, sonuç hiç de iç açıcı değil; pek çok insan bakmış, okumuş challange'ları ama kimse bir yorum da bulunmamış, nihai olarak aklımdakileri burada paylaşmak niyetinde idim; ama şu an ondan bile emin değilim.

Bu kadar zor olmamalı idi, bilmiyorsak dahi araştırmak, yahut fikir beyan etmek. Lafım sizin şahsınıza değil elbette; genele. Bu öğrenmeye olan isteksizlik beni çok üzüyor. Herkes; armut pişsin ağzına düşsün istiyor sanıyorum. Oysaki ilk challange hariç diğer ikisi o kadar da zor değildi. Kısacık bir google araştırması dahi ipuçlarını vermeye yetiyordu.

Keşke birileri bu araştırmaları yapmış olsa idi ve "şu değil mi bunun cevabı" diye sorsaydı; ya da, "bu fonksiyon/api olduğunu düşünüyorum ama nasıl kullanıldığını anlayamadım" dese idi; maalesef bunu bile duyamadık/göremedik. "Heves nasıl kırılır ?" sorusunun cevabını her daim alıyorum gerçekten de.

Sırf bu sebepten ötürü çok uzun zamandır sitem de de bir şey paylaşmıyorum; nasılsa kimsenin okuduğu ya da öğrenmek istediği yok. Boş yere emek ve zaman kaybı gibi görünüyor.

"Bilgim az, o sebeple yazmadım, ya doğru değilse diye çekindim!" söylemleri de manasız; amacımız kimseyi mülakata sokmak değil ki, bunu cevaplayamazsanız ya da yanlış bir cevap verirseniz inanın kimse sizi burada ayıplamaz/ayıplayamaz. Bunu yapacak insan da yok zaten burada.

Herneyse velhasıl, "bir dokun bin ah işit" gibi oldu; lütfen kusuruma bakma @G.Arkas. Ama ciddi anlamda hissettiklerim de bunlar. Belki kabullenmek zor ama; "yeni bir şeyler öğrenmek hususunda üşengeçiz, bildiklerimizi paylaşmak anlamında ise bencil..."
:D @thelvacı Hocam estağfurullah. Sonuna kadar haklısın. Mesela ben 1. Challenge'da soruyu bile doğru anlamamışım. MemoryMapped'den bahsetmişim ahahahah :D

Audio transferi yaparken Thread'ı kırmakla alakalı olarak bir soru sormuştum özelden. Aslında kırmak değilde Thread'ı sonlandıramıyordum. (Suspend, Terminate hiç birisi olmuyordu) Siz de bir threadı sonlandırırken diğer bir thread'ı etkilememen gerekir demiştiniz. Ben BeginThread ile Id alıp sonlandırıken, formsuz bir uygulama olduğu için MessageLoop thread kullanmıştım. Siz de yanlış demiştiniz. Bende daha sonra tamamını tek bir Thread nesnesi ile yönetim çözüme gittim ama verdiğiniz cevaptan bununda tam çözüm olmadığını anlıyorum.

Paylaşımlarınız devam etmeli hocam. Sitenize ben defalarca girdim kaynak araştırmak için. "İlk zamanlar hiç bir şey anlamadım." çünkü Thread benim için Application.ProcessMessage gibi bir şeydi. (Tam olarak ne olduğunu bile bilmiyordum) Ama örnek yaparak, sizlerin kodların inceleyerek çözüme ulaştım çoğu defa. Bu sebepten sakın sitem takip edilmiyor diye düşünmeyin. Öyle zamanlarda öyle çok işe yarıyor ki bir bilseniz şaşırırsınız. Türkçe kaynak zaten yok. İngilizce öğrenme konusunda da her şeyde olduğu gibi tembeliz. Bu kaynaklarda olmasa işimiz iş olur iyice. Bu ülke de her daim sizin gibi insanlara ihtiyaç vardır. Evet belki biz tembeliz ama yine de sizlerin her daim desteklerinize ihtiyacımız olmakta. Mesela Muharrem abinin mesleği çok başka ama belki hobi olarak programcılık yapıyor, ya da sevdiği için. Yine de kendisi gelip burada bizlere özgün çözümler sunuyor. Yapmaya da bilir, mecbur değil ama yapıyor. Tıpkı sizin gibi. Bilgi gerçekten de paylaştıkça çoğalıyor hocam. He belki bizim ülkemizde daha yavaş çoğalıyor ama inanın çoğalıyor.

İnşallah Challenge işlerine devam ederiz. Kendi adıma Veli abi'nin (@SimaWB) dediği gibi mesai saatlerinde olması biraz beni etkiliyor. Ama inşallah iş çıkışlarında katılmaya çalışırız. Zaten seçtiğiniz konu (Thread:Sizin sitenizde bahsettiğiniz gibi korkulacak bir şey gibi görülüyor) belki çok hakkında bilgimizin olmadığı bir şey ama araştırmaya şevk ettiğinizin farkına varamıyoruz sanırım. Bunun farkına varırsak inşallah güneşli günler yakında. :D :D

Kolay gelsin.
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 2

Mesaj gönderen thelvaci »

G.Arkas yazdı:
thelvaci yazdı:
G.Arkas yazdı:@thelvacı hocam ben bununla ilgili bir soru sormuştum size zamanında bilmem hatırlar mısınız :D Çok canımı yakan bir konuydu bu. Zaten bulduğum çözümüde beğenmemiştiniz. Şimdi bunu yine versem sıkıntı olacak benim için :D
:) Hatırlayamıyorum neden beğenmediğimi ama amacımız beğenmek de değil şu aşamada. Arkadaşlarımızın araştırma hevesi var mı, yok mu; öğrenme istekleri canlı mı değil mi bunu görüyoruz aslında burada. Ve maalesef, sonuç hiç de iç açıcı değil; pek çok insan bakmış, okumuş challange'ları ama kimse bir yorum da bulunmamış, nihai olarak aklımdakileri burada paylaşmak niyetinde idim; ama şu an ondan bile emin değilim.

Bu kadar zor olmamalı idi, bilmiyorsak dahi araştırmak, yahut fikir beyan etmek. Lafım sizin şahsınıza değil elbette; genele. Bu öğrenmeye olan isteksizlik beni çok üzüyor. Herkes; armut pişsin ağzına düşsün istiyor sanıyorum. Oysaki ilk challange hariç diğer ikisi o kadar da zor değildi. Kısacık bir google araştırması dahi ipuçlarını vermeye yetiyordu.

Keşke birileri bu araştırmaları yapmış olsa idi ve "şu değil mi bunun cevabı" diye sorsaydı; ya da, "bu fonksiyon/api olduğunu düşünüyorum ama nasıl kullanıldığını anlayamadım" dese idi; maalesef bunu bile duyamadık/göremedik. "Heves nasıl kırılır ?" sorusunun cevabını her daim alıyorum gerçekten de.

Sırf bu sebepten ötürü çok uzun zamandır sitem de de bir şey paylaşmıyorum; nasılsa kimsenin okuduğu ya da öğrenmek istediği yok. Boş yere emek ve zaman kaybı gibi görünüyor.

"Bilgim az, o sebeple yazmadım, ya doğru değilse diye çekindim!" söylemleri de manasız; amacımız kimseyi mülakata sokmak değil ki, bunu cevaplayamazsanız ya da yanlış bir cevap verirseniz inanın kimse sizi burada ayıplamaz/ayıplayamaz. Bunu yapacak insan da yok zaten burada.

Herneyse velhasıl, "bir dokun bin ah işit" gibi oldu; lütfen kusuruma bakma @G.Arkas. Ama ciddi anlamda hissettiklerim de bunlar. Belki kabullenmek zor ama; "yeni bir şeyler öğrenmek hususunda üşengeçiz, bildiklerimizi paylaşmak anlamında ise bencil..."
:D @thelvacı Hocam estağfurullah. Sonuna kadar haklısın. Mesela ben 1. Challenge'da soruyu bile doğru anlamamışım. MemoryMapped'den bahsetmişim ahahahah :D

Audio transferi yaparken Thread'ı kırmakla alakalı olarak bir soru sormuştum özelden. Aslında kırmak değilde Thread'ı sonlandıramıyordum. (Suspend, Terminate hiç birisi olmuyordu) Siz de bir threadı sonlandırırken diğer bir thread'ı etkilememen gerekir demiştiniz. Ben BeginThread ile Id alıp sonlandırıken, formsuz bir uygulama olduğu için MessageLoop thread kullanmıştım. Siz de yanlış demiştiniz. Bende daha sonra tamamını tek bir Thread nesnesi ile yönetim çözüme gittim ama verdiğiniz cevaptan bununda tam çözüm olmadığını anlıyorum.

Paylaşımlarınız devam etmeli hocam. Sitenize ben defalarca girdim kaynak araştırmak için. "İlk zamanlar hiç bir şey anlamadım." çünkü Thread benim için Application.ProcessMessage gibi bir şeydi. (Tam olarak ne olduğunu bile bilmiyordum) Ama örnek yaparak, sizlerin kodların inceleyerek çözüme ulaştım çoğu defa. Bu sebepten sakın sitem takip edilmiyor diye düşünmeyin. Öyle zamanlarda öyle çok işe yarıyor ki bir bilseniz şaşırırsınız. Türkçe kaynak zaten yok. İngilizce öğrenme konusunda da her şeyde olduğu gibi tembeliz. Bu kaynaklarda olmasa işimiz iş olur iyice. Bu ülke de her daim sizin gibi insanlara ihtiyaç vardır. Evet belki biz tembeliz ama yine de sizlerin her daim desteklerinize ihtiyacımız olmakta. Mesela Muharrem abinin mesleği çok başka ama belki hobi olarak programcılık yapıyor, ya da sevdiği için. Yine de kendisi gelip burada bizlere özgün çözümler sunuyor. Yapmaya da bilir, mecbur değil ama yapıyor. Tıpkı sizin gibi. Bilgi gerçekten de paylaştıkça çoğalıyor hocam. He belki bizim ülkemizde daha yavaş çoğalıyor ama inanın çoğalıyor.

İnşallah Challenge işlerine devam ederiz. Kendi adıma Veli abi'nin (@SimaWB) dediği gibi mesai saatlerinde olması biraz beni etkiliyor. Ama inşallah iş çıkışlarında katılmaya çalışırız. Zaten seçtiğiniz konu (Thread:Sizin sitenizde bahsettiğiniz gibi korkulacak bir şey gibi görülüyor) belki çok hakkında bilgimizin olmadığı bir şey ama araştırmaya şevk ettiğinizin farkına varamıyoruz sanırım. Bunun farkına varırsak inşallah güneşli günler yakında. :D :D

Kolay gelsin.
İyi temennilerinize ve iltifatlarınıza teşekkür ederim. Umarım sizin dediğiniz gibi olur da güneş altında bronzlaşacak hale geliriz :)
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 2

Mesaj gönderen esistem »

Selam,
Tuğrul hocam iyi sitem etmişsiniz, iş dolayısı ile sürekli foruma girip bakamasam bile şu challenge olayını ortaya attığınız birkaç günden beri her gün girip okuyorum lakin sizleri görünce ben delphi yi hiç bilmiyormuşum gibi bir hisse kapılıyorum. Öncelikle ingilizcem 80 li yıllardan kalma :) Niye kendini geliştirmedin derseniz ne maddi imkan nede manevi destek yoktu maalesef :( Birde verdiğiniz konular anladığım kadarı ile bana yabancı yada ben ingilizce terimler yerine türkçe tercih ettiğim için anlamıyorum. Kendi sitenizde bir süredir yeni makaleler paylaşmamanıza gelince, siz belki takip edilmiyor sanıyorsunuz ama merak etmeyin takipte birçok kişi var, özellikle ben boş kaldıkça ilgimi çeken bir konu varmı diye girip okuyorum. Şu thread olayından mesela hakikatten dehşet korkuyorum. Şahsen herhangi bir konuda takıldığımda biryerlerde de o konu hakkında bir kod vs. bişi bulursam alıp direk kopyala yapıştır yapmaktansa ulan bu adam bunu nasıl yapmış neden bunu böyle yazmış diye günlerce bazen haftalarca araştırdığım olur. Şu thread işine girince de öyle olucak kesin, sanırım o yüzden biraz geri çekiyorum kendimi. Birde yıllardır devam eden bir türlü bitmeyen projememi bakayım yeni konularmı araştırayım karmakarışık bir durumdayım son 1 yıldır. Örneğin son 6 aydır yaptığım projeye uzaktan cep tlf, tablet yada başka bir pc den kullanıcıları en hızlı nasıl bağlarım diye araştırma yapıyorum php, lazarus, python, C, java ve hatta autoit gibi bir ton şeyi araştırdıktan sonra döndüm yine delphi ile yazmaya başladım. Neyse konuyu dağıtmıyayım siz bence challenge olayına devam edin hocam, şahsen forumda sizin gibi uzman kişiler olduğu için kendimi gayet şanslı görüyorum. Kimsenin hiçbir fikri olmadığı bir konuda siz yada diğer uzman olarak gördüğüm arkadaşlar şunu şöyle yaparsan olur yada basitçe bir api yada şu paketi bi araştır dediğinde olayın çözüldüğü zamanlar gayet mutlu mesut kod yazmaya devam edebiliyorum. Allah sizden razı olsun daha ne diyeyim hocam.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 2

Mesaj gönderen thelvaci »

Rabbim cümlemizden razı olsun @esistem.
Cevapla