loaded yazdı:Tuğrul Bey ilginiz ve geri dönüşünüz için çok teşekkür ederim.
İlginç olan şu ki ; Yanıt vermeme durumu her zaman aynı değil bazen 3 dakika boyunca sorun yokken bazen dediğiniz gibi 5 saniyede oluşuyor.
Thread konusunu ile ilgili olarak öncelerde çok araştırma yaptım hatta başlangıç noktam sayfanız olmuştu. (Özellikle Paralel Programlama)
Konu ile ilgili yaptığım denemelerde thread mevzusunun da kendi çapında çıkmazları olduğunu gördüm. Çalışma esnasında form nesnelerinin kontrolleri konusunda sıkıntılar yaşamam sebebiyle bu yöntemden vazgeçmiştim.(Yada ben beceremedim)
Çünki 4 çekirdekli bir işlemcide program yanıt vermeme aşamasına düştüğünde işlemcinin çalışma yüzdesi %25 ti.
Yani geriye kalan %75 lik kısmın yarısını bile programa tahsis edebilseydim istediğimi direk elde etmiş olacaktım.
Paralel programlama iyidir hoştur ancak dikkat edilesi bazı ufak tefek noktaları vardır; onlara yeterince özen gösterir iseniz eğer; yaşadığınız sıkıntıları aşabileceğinize inanıyorum. Öncelikle, makalelerimi okudu iseniz thread'ler hususunda; VCL'in thread güvenlikli olmadığını biliyor olmalısınız. Herhangi bir thread içinden ortak kullanılan alanlara erişim hususunda son derece dikkatli olmanız icap eder. Aksi durumda; beklenmeyen neticeler almanız son derece olasıdır.
Uygulamanızın main thread'i zaman zaman yanıt vermez durumda oluyor ise ve yapılan iş aşağı yukarı aynı zaman diliminde tamamlanıyor ise yine görünmeyen/gizli bir sorununuz var demektir. Bu cümlenizden çıkarttığım kadarı ile zaman zaman uygulamanızın ana thread'inin mesaj kuyruğu işleme giriyor(Application.ProcessMessage->GetMessage->TranslateMessage->DispatchMessage); zaman zaman da girmiyor demektir. Mesajları mesaj kuyruğundan alıp almama koşulunuzu uygulamanız içinde incelemenizi öneririm. Aksi taktirde yapılan iş hep aynı sürede oluyor ise; aynı şekilde her daim uygulamanızın yanıt vermiyor durumuna geçmesi gerekir idi.
Şu aşamadan sonra mevcut kodlarınızı thread programlama ile değiştirme cihetine gidecekseniz eğer; nacizane tavsiye olarak ilk aşamada; işlemcinizde kaç çekirdek var ise çekirdek sayısı * 2 kadar thread create etmenizi öneririm en fazla. Ardından da VCL ile haberleşecek ise thread'leriniz bu haberleşme kodunuzu TThread.Queue ile sarmalamanızı öneririm.
TThread.Synchronize metodunu da kullanabilirsiniz ama, bu beklenmeyen deadlock'lar ile karşılaşmanıza neden olabilir. Örneğin; uygulamanızın ana thread'i herhangi bir kernel nesnesini bekliyor ise (WaitForSingle/MultipleObjects vb) ve ilgili kernel nesnesini
signaled duruma sokacak olan thread'de uygulamanın main thread'inde çalışması için bir TThread.Synchronize çağrımı gerçekleştirir ise işte tam bu noktada uygulamanız kilitlenecektir. Çünkü ana thread x thread'inin kullandığı bir kernel nesnesini bekler iken, kernel nesnesi ile işlem yapan thread'de ana thread'e:
"al şu kodu çalıştır" demiştir. Main thread blocking durumda olduğu için, ilgili emri yerine getiremez; bu emri veren thread'e ilgili emrin yerine gelmesini beklediği için asla bir sonraki satırı(kernel nesnesini signaled duruma sokan kodu) işletemez ve karşınızda nur topu gibi bir
DEADLOCK!
Threading dediğim gibi iyidir, hoştur lâkin tasarımın iyi olması ve thread'ler arası haberleşmede kullanıcak senk. nesnelerinin ve bu yapıların dikkat ile kullanılması gerekir.