13-12-2021, Saat: 19:24
Yoğun bir tempoda çalıştığım için bu aralar, pek dikkatlice okuyamadım ama; anladığım kadarı ile çözüm getirmeye çalışayım. Öncelikle; Delphi'nin yeni versiyonlarında thread pool sınıfları var. Ama siz kendiniz implemente etmek isterseniz; belirli bir sayıda thread'i (best practice olarak, çekirdek sayısı * 2) başlatarak bir thread güvenlikli queue ile (Örneğin TThreadQueue) çalışabilirsiniz.
Kuyrukta bir şey olmadığı durumda, çalışan tüm threadler kuyruktan bir item çekemeyecek dolayısı ile bekler durumda olacaklardır. Kuyruğa bir şey geldiğinde kuyruğu consume etmeye çalışan 10 thread'den şanslı olanı kuyruktan item'i çekecek ve kuyruk yeniden boş kalacağı için 9 adet thread'de kuyruğa bir şey gelmesini bekler durumda olacaklardır.
Tüm thread'lerin bitmesini beklemeniz gerekiyor ise bir adet TCountDownEvent create eder ve ilk değerini thread sayısı olarak verirsiniz. Biten her thread TCountDownEvent nesnesinin Signal metodunu çağırır ve siz de uygulamanızın ana thread'inde; TCountDownEvent'i bekleyebilirsiniz. Ama benim bahsettiğim thread'in sonlanması. Yoksa, verilen işi yapıp işi bitirmesi değil. Zaten ilgili thread'iniz içinde bir nevi döngü ile dönmelisiniz.
Bunlar tabii, Delphi'nin sunduğu imkanlar. Windows API ile sunulan bir çok başka imkan da mevcut. Umarım; ne demek istediğinizi okuyabildiğim kısa paragraflardan doğru anlayabilmiş ve yardımcı olabilmişimdir.
Sizin için bir örnek hazırladım. Umarım faydalı olur.
Marman_ThreadQueue_Deneme.zip (Dosya Boyutu: 54,07 KB / İndirme Sayısı: 41)
Kuyrukta bir şey olmadığı durumda, çalışan tüm threadler kuyruktan bir item çekemeyecek dolayısı ile bekler durumda olacaklardır. Kuyruğa bir şey geldiğinde kuyruğu consume etmeye çalışan 10 thread'den şanslı olanı kuyruktan item'i çekecek ve kuyruk yeniden boş kalacağı için 9 adet thread'de kuyruğa bir şey gelmesini bekler durumda olacaklardır.
Tüm thread'lerin bitmesini beklemeniz gerekiyor ise bir adet TCountDownEvent create eder ve ilk değerini thread sayısı olarak verirsiniz. Biten her thread TCountDownEvent nesnesinin Signal metodunu çağırır ve siz de uygulamanızın ana thread'inde; TCountDownEvent'i bekleyebilirsiniz. Ama benim bahsettiğim thread'in sonlanması. Yoksa, verilen işi yapıp işi bitirmesi değil. Zaten ilgili thread'iniz içinde bir nevi döngü ile dönmelisiniz.
Bunlar tabii, Delphi'nin sunduğu imkanlar. Windows API ile sunulan bir çok başka imkan da mevcut. Umarım; ne demek istediğinizi okuyabildiğim kısa paragraflardan doğru anlayabilmiş ve yardımcı olabilmişimdir.
Sizin için bir örnek hazırladım. Umarım faydalı olur.
Marman_ThreadQueue_Deneme.zip (Dosya Boyutu: 54,07 KB / İndirme Sayısı: 41)
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...

