Challenge 6

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

Re: Challenge 6

Mesaj gönderen thelvaci »

sadettinpolat yazdı:debugger ekranindan bakip anlarim :)

Resim


Wait Chain Traversal ile bulunuyormus ama detayini tam olarak bilmiyorum
:bravo:
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 6

Mesaj gönderen thelvaci »

sadettinpolat yazdı:benim anlamadigim kisim surasi.

WaitForSingleObject , thread bitene kadar ana threadi bekletiyor. bu bekleme esnasinda ana threade herhangi bir mesaj bile iletilmiyor.
madem ana thread ikinci threadi bekleyecek neden thread kullaniyoruz ? ikinci threadde ki islemi ana thread icinde yapsak yine ayni kapiya cikmiyor muyuz ?
Sevgili kardeşim, şimdi şöyle bir durum hiç başına gelmedi mi ? Paralel olarak yapman gereken bir iş var bunun için bir thread create ettin ve saldın çayıra. O arada da yapman gereken başka işler vardı onları yapıyorsun; yapacakların bitti ama devam edebilmenin tek koşulu thread'in de işini bitirmesi ;) Yada; sürekli iş yapan thread'lerin var ve uygulamanın kapanması gerekti; sende thread'ine kapanması gerektiğini bir şekilde ilettin; ardından WaitForSingleObject ile sonlanmasını bekliyorsun. Ama thread'in döngü başında kontrol ettiğin kapanma kodunu henüz işlemedi döngünün ortalarında bir yerde ve ana thread ile haberleşmeye çalıştı TThread.Synchronize ile yada SendMessage ile. Olmaz mı ? Emin ol olur :D
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 6

Mesaj gönderen thelvaci »

Evet hangi thread'lerimiz bloklanmış, aşağıdaki API'leri kullanarak bulmaya çalışın:

Wait Chain Traversal

WCT Reference

Using WCT

Developing with Wait Chain Traversal

LPC/ALPC gibi olmasın lütfen, kodu yine bana yazdırmayın :)
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Challenge 6

Mesaj gönderen SimaWB »

"Challenge"lar için öneri: viewtopic.php?f=11&t=34942
There's no place like 127.0.0.1
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Challenge 6

Mesaj gönderen sadettinpolat »

thelvaci yazdı:
sadettinpolat yazdı:benim anlamadigim kisim surasi.

WaitForSingleObject , thread bitene kadar ana threadi bekletiyor. bu bekleme esnasinda ana threade herhangi bir mesaj bile iletilmiyor.
madem ana thread ikinci threadi bekleyecek neden thread kullaniyoruz ? ikinci threadde ki islemi ana thread icinde yapsak yine ayni kapiya cikmiyor muyuz ?
Sevgili kardeşim, şimdi şöyle bir durum hiç başına gelmedi mi ? Paralel olarak yapman gereken bir iş var bunun için bir thread create ettin ve saldın çayıra. O arada da yapman gereken başka işler vardı onları yapıyorsun; yapacakların bitti ama devam edebilmenin tek koşulu thread'in de işini bitirmesi ;) Yada; sürekli iş yapan thread'lerin var ve uygulamanın kapanması gerekti; sende thread'ine kapanması gerektiğini bir şekilde ilettin; ardından WaitForSingleObject ile sonlanmasını bekliyorsun. Ama thread'in döngü başında kontrol ettiğin kapanma kodunu henüz işlemedi döngünün ortalarında bir yerde ve ana thread ile haberleşmeye çalıştı TThread.Synchronize ile yada SendMessage ile. Olmaz mı ? Emin ol olur :D
Tugrul abi , threadleri kullaniyorum , dedigin gibi durumlar tabiki olustu. Bekleme islemi icin WaitForSingleObject'i kullandim. Ana thread blocklaninca sanirim ben yanlis kullaniyorum diyip Thread icine ekledigim bir degisken/metod ile bu kontrolleri yapmaya basladim. Yillardir da ayni sekilde yapmaya devam ediyorum. Ya bir degiskenle ya da ThreadDone metodu vasitasiyla WaitForSingleObject'i bugune kadar hep es gectim :)
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Challenge 6

Mesaj gönderen sadettinpolat »

Eski kodlara soyle bir baktimta thread ile ana thread arasinda SendMessage ile haberlesmisim ama Allah'tan WaitForSingleObject kullanmamisim :)
Threadin calisip calismadigini kendim kontrol ettigim icin herhangi bir deadlock yasamadan program bugunlere kadar calisip gelmis.

ne olur ne olmaz sendmessage'i post messsage ile degistireyim :)

Kod: Tümünü seç

procedure TThread.LogYaz;
begin
 LogMemo.Lines.AddStrings(logs); //LogMemo ana threadde yer alan bir obje
 SendMessage(LogMemo.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
 logs.Clear;
end;
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Challenge 6

Mesaj gönderen ikra »

thelvaci yazdı:
sadettinpolat yazdı:debugger ekranindan bakip anlarim :)

Resim


Wait Chain Traversal ile bulunuyormus ama detayini tam olarak bilmiyorum
:bravo:
Tugrul abi, bu benim yukarida yazdigimin aynisi olmamis mi? CriticalSection'u kilitliyor ve unlock yapmiyor. Haliyle bloke edilmis oluyor. Bak ben alkis almadim, cok küstüm :D :D :D
kıdemsiz üye
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 6

Mesaj gönderen thelvaci »

ikra yazdı:
thelvaci yazdı:
sadettinpolat yazdı:debugger ekranindan bakip anlarim :)

Resim


Wait Chain Traversal ile bulunuyormus ama detayini tam olarak bilmiyorum
:bravo:
Tugrul abi, bu benim yukarida yazdigimin aynisi olmamis mi? CriticalSection'u kilitliyor ve unlock yapmiyor. Haliyle bloke edilmis oluyor. Bak ben alkis almadim, cok küstüm :D :D :D
:) Evet senin de dediğin gibi thread'leri kilitleyip deadlock'a ulaştırmak için milyon tane yol bulunabilir. Sadettin'e bravo dememin nedeni WTC API'sini bulduğu için. Senin kıymetli bir programcı olduğunu biliyorum, çözümü bulmasan dahi seni alkışlayabilirim :bravo: Ama WTC ile ilgili basit bir örnek paylaşır isen daha çok alkışlarım :)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 6

Mesaj gönderen thelvaci »

sadettinpolat yazdı:Eski kodlara soyle bir baktimta thread ile ana thread arasinda SendMessage ile haberlesmisim ama Allah'tan WaitForSingleObject kullanmamisim :)
Threadin calisip calismadigini kendim kontrol ettigim icin herhangi bir deadlock yasamadan program bugunlere kadar calisip gelmis.

ne olur ne olmaz sendmessage'i post messsage ile degistireyim :)

Kod: Tümünü seç

procedure TThread.LogYaz;
begin
 LogMemo.Lines.AddStrings(logs); //LogMemo ana threadde yer alan bir obje
 SendMessage(LogMemo.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
 logs.Clear;
end;
Bu arada ilginç bir şekilde WaitForSingleObject yerine TThread.WaitFor ile beklediğinizde uygulama kilitlenmiyor.! Bir ara TThread.WaitFor'un implementasyonun da ne olduğuna da bakmak lazım. ;) Gerçi onun da kendince bir bug'ı vardı düzelttiler mi bilmiyorum elbette, deneme fırsatım olmadı.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 6

Mesaj gönderen esistem »

İzlenmiyor, okunmuyor zannetmeyin ben hep buralardayım sürekli takipteyim.
Bilin istedim :)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 6

Mesaj gönderen thelvaci »

esistem yazdı:İzlenmiyor, okunmuyor zannetmeyin ben hep buralardayım sürekli takipteyim.
Bilin istedim :)
Bu konu diğerine göre nispeten daha kolay bir konu; ne de olsa undocumented api kullanmak zorunda değiliz. O halde buna küçük bir örnek yazabilirsiniz diye düşünüyorum, undocumented lpc/alpc'deki performansınıza binaen ;)
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Challenge 6

Mesaj gönderen SimaWB »

Uygulamamızın oluşturduğu thread'lerin listesini almak için CreateToolhelp32Snapshot,Thread32First ve Thread32Next fonksiyonlarını kullanabilirmişiz. Kodu buraya kopyala yapıştır yapmaya gerek yok sanırım. İlgilenenlere link.
Bloke olan threadleri de listeliyor mu bilemiyorum. Şuanda denemek için zamanım yok :(
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 6

Mesaj gönderen thelvaci »

SimaWB yazdı:Uygulamamızın oluşturduğu thread'lerin listesini almak için CreateToolhelp32Snapshot,Thread32First ve Thread32Next fonksiyonlarını kullanabilirmişiz. Kodu buraya kopyala yapıştır yapmaya gerek yok sanırım. İlgilenenlere link.
Bloke olan threadleri de listeliyor mu bilemiyorum. Şuanda denemek için zamanım yok :(
Hayır Veli bey, Toolhelp API'leri bloke olan thread'leri göstermez. Linklerini verdiğim WCT API'leri bu iş için tasarlanmış API'ler. Task Manager'da bu API'leri kullanıyor. Task Manager üzerinde herhangi bir process'in üzerinde sağ tıkladığınızda gördüğünüz "Analyze Wait Chain" menü item'ı da bu API'leri kullanıyor. Gerçi pek detaylı malümat vermiyor.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Challenge 6

Mesaj gönderen SimaWB »

Burada WTC'nin kullanımı ve DeadLock Checker mevcut. Basit bir örnek yazmak bile epey vakit alacak gibi görünüyor. Ancak haftasonu bir örnek yapabilirim bunun için :(
Zamanı olanlar için linki paylaşmak istedim. İnşallah "Challenge" mantığına ters birşey yapmamışımdır :oops:
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 6

Mesaj gönderen thelvaci »

Olur mu canım hiç, teşekkür ederim. Öğrenmeye yapılan her katkı, katkıdır. Tabii gerçekten öğrenmenin temel noktası kendimizin araştırarak bir şeyler üretmesidir bence. Kendi yazmadığımız koddan pek fazla bir şey öğrenebileceğimizi sanmıyorum. Küçük de olsa bir örnek ile bu challange bitmeden sizlerin de istediği gibi diğer challange'a geçmeyeceğim.
Cevapla