sadettinpolat yazdı:debugger ekranindan bakip anlarim
Wait Chain Traversal ile bulunuyormus ama detayini tam olarak bilmiyorum

sadettinpolat yazdı:debugger ekranindan bakip anlarim
Wait Chain Traversal ile bulunuyormus ama detayini tam olarak bilmiyorum
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 bitirmesisadettinpolat 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 ?
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 bitirmesisadettinpolat 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 ?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
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;
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
ikra 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![]()
![]()
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.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 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
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