Konuyu hortlatayım
Yakın bir zamanda DevArt'ın MyDac component setini satın aldık. DevArt ürünleri için "thread-safe & multi-threaded" demesine rağmen ben bir sıkıntı yaşıyorum. Bu sıkıntı belki de MyDAC yerine FireDAC kullanmama neden olacak.
Yine sizlerin tecrübelerine müraacaat etmek istiyorum; ancak ondan önce ne yapmaya çalıştığımı ve nasıl yapacağım hakkında neden bir fikrim olmadığını izaha gayret edeyim.
Öncelikle kısaca yapmak istediğim;
- Formun üzerine bir adet TMyStoredProc koymak. (Design time'da içine field'larımı doldurabileyim ve field'larımı özelleştirebileyim, grid tasarımlarını yapabileyim vs.)
- Bu TMyStoredProc'u Open eder iken (bu bir select stored procedure'si) işlemin uzun sürebilme ihtimaline binaen; TMyStoredProc'u bir thread içinden açmak. (Arkadaşlar bizim componentlerimiz thread-safe dedikleri için).
- Eh bir thread içinde veritabanı erişimi, ayrı bir connection gerektirir(Thread'e özgü bir connection). Bu bilgiye istinaden, thread içinde bir connection create ediyor; TMyStoredProc'un Connection'unu bu bağlantı nesnesine eşitliyor, ardından procedure'ü Open ediyor ve Connection'unu yeniden orjinal connection'a çekip; geçici connection'u Free ediyorum. Tabii böyle olunca, doğal olarak gelen Data kayboluyor.
Özet ile benim yapmak istediğim şey, formun üzerinde bir component olarak bulunan bir TMyStoredProc'u bir başka thread içinden açabilmek. Bu sayede uygulamamın ana thread'i bloklanmayacak ve kullanıcı çok uzun sürebilecek işlemleri durdurabilecek.
FireDAC'da bu istediklerimin hepsi var. Ancak gördüğüm kadarı ile DevArt'ın ürünlerinde Asenkron Çalıştırma desteği yok. Durum öyle olunca da kendi asenkron yapımızı oluşturmamız gerekiyor.
Sizlerin bu hususta bir tecrübesi oldu mu ? Insert, Update, Delete stored procedure'leri için bir thread içinde işlem yapmak basit; lâkin durum select için formun üzerindeki bir bileşeni thread içinde kullanmak olunca, biraz farklılaşıyor.
Her türlü yorumunuz ilgi ile takip edilecektir
Not: Neden bir fikrim olmadığı hakkındaki malümatı belirtmeyi unutmuşum. Ben DevArt componentlerini geliştiren ekibin içinde olsaydım; büyük olasılıkla Open çağrımı yapıldığı anda ilgili thread id'yi elde eder, main thread'den farklı ise içeride bir connection create eder ve o connection üzerinden yürürdüm. Ama tabii adamların neyi nasıl implemente ettiklerini henüz bilmiyorum. Bu nedenle bir fikrim yok henüz.