sadettinpolat yazdı:debugger ekranindan bakip anlarim
Wait Chain Traversal ile bulunuyormus ama detayini tam olarak bilmiyorum
Challenge 6
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Challenge 6
Re: Challenge 6
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 olursadettinpolat 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 ?
Re: Challenge 6
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
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
Re: Challenge 6
"Challenge"lar için öneri: viewtopic.php?f=11&t=34942
There's no place like 127.0.0.1
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
Re: Challenge 6
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 gectimthelvaci yazdı: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 olursadettinpolat 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 ?
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
Re: Challenge 6
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
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;
Re: Challenge 6
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ümthelvaci yazdı:sadettinpolat yazdı:debugger ekranindan bakip anlarim
Wait Chain Traversal ile bulunuyormus ama detayini tam olarak bilmiyorum
kıdemsiz üye
Re: Challenge 6
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 Ama WTC ile ilgili basit bir örnek paylaşır isen daha çok alkışlarımikra yazdı: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ümthelvaci yazdı:sadettinpolat yazdı:debugger ekranindan bakip anlarim
Wait Chain Traversal ile bulunuyormus ama detayini tam olarak bilmiyorum
Re: Challenge 6
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ı.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;
Re: Challenge 6
İzlenmiyor, okunmuyor zannetmeyin ben hep buralardayım sürekli takipteyim.
Bilin istedim
Bilin istedim
Re: Challenge 6
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 binaenesistem yazdı:İzlenmiyor, okunmuyor zannetmeyin ben hep buralardayım sürekli takipteyim.
Bilin istedim
Re: Challenge 6
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
Bloke olan threadleri de listeliyor mu bilemiyorum. Şuanda denemek için zamanım yok
There's no place like 127.0.0.1
Re: Challenge 6
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.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
Re: Challenge 6
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
Zamanı olanlar için linki paylaşmak istedim. İnşallah "Challenge" mantığına ters birşey yapmamışımdır
There's no place like 127.0.0.1
Re: Challenge 6
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.