Thread ve senkronizasyon

Başlatan Klein, 15 Aralık 2013, 22:24:00

Klein

TThread execute motodu içerisinde VCL nesnelerinin metodlarına çağrı yaptığımızda senkronize metou ile çağrı yapmamız gerekiyor.
Peki bu durum tüm VCL nesneleri için mi geçerli yoksa GUI üzerinde çalışan ( Çalışma esnasında görünen) nesneler mi geçerli?

Indy TCPClient nesnesine çağrı yaparken senkronize etmem gerekir mi?

t43

indy blok olarak çalışır.ayrı bir kanalda (Thread) da işlem yaptırmak her zaman daha sağlıklıdır.

eğer gui ile veya nesne ile irtibatlarda senkronize kullanılır.

sebebi ise bazı anlar olur işletim sisteminde mesajlar çakışabilir.olmayan adrese erişilmeye sebebiyet verir.
bu da geçersiz adres hata verdirir.bazen de exe sonlanır.

Klein

Alıntı yapılan: t43 - 16 Aralık 2013, 00:39:54

gui ile veya nesne ile irtibatlarda senkronize kullanılır.


Gui veya nesne deyince işler çok karışıyor. Tüm nesnelere yapılan  çağrılar için senkronizasyon gerekli değil.
Delphi VCL nesneleri 'thread safe' olmadığı için senkronlamak gerekiyor. 

Peki  VCL nesneleri denildiğinde ne anlamalıyız?

VCL Nesneleri dediğimiz zaman Sadece GUI katmanında çalışan nesneleri mi anlamalıyız?
VCL dediğimizde  Forma konulabilen tüm nesneleri mi anlamalıyız ? yoksa Sadece görünebilir olanları mı?

Esas soru bu. VCL sözünden ne anlamalıyız?

t43

#3
vcl görsel olanlar.
rtl nesne ama görünmeyenler.unit gibi düşünebilirsin yada resurce dosyası da olabilir.

zaten thread kullanıyorsan önemli bir iş yapılacaktır.veya daimi olarak blok şekilde veri aktarımı yapıyorsundur yada ses farketmez.

TForm yani yeni bir uygulama için oluşturduğun sınıfa TForm1 dersek misal olarak bu sınıfın içindeki nesnelerin hepsi mesajları okur ama ilgili olanları yakalayıp iş yapar.

ama TForm1 hepsini kapsadığından buton ile edite yazı yazdırmada yada döngüyle listelere veri eklemede problem çıkmaz.

application.processmessages; kullanırsan girdiği döngüyü işlerken bir işlem sırası da TForm1 yani aslında application nesnesine verir .
zaten o esnada listbox yada memo listenin yenilendiğini gözle takip edebilirsin.

yapmak istediğin neyse onu belirtirsen sorunu halletmeye uğraşırız.


Klein

Alıntı yapılan: t43 - 16 Aralık 2013, 03:57:53
vcl görsel olanlar.
rtl nesne ama görünmeyenler.unit gibi düşünebilirsin yada resurce dosyası da olabilir.

Bu durumda;
TactionList, TClipboard  çalışma anında formda görünmüyorlar.  O zaman VCL nesnesi değiller.
Ama kütüphanede VCL klasörünün altındalar ve Unit isimleri VCL. ile başlıyor. Peki neden buradalar.

Soruyu tekrar ediyorum
Bir nesneyi VCL nesnesi yapan ve Thread içinde senkronize çağrısı yapılmasın gerektiğini gösteren  tek kriter  Görsel olması mı?

Alıntı yapılan: t43 - 16 Aralık 2013, 03:57:53

yapmak istediğin neyse onu belirtirsen sorunu halletmeye uğraşırız.

Yapmak istediğim şey belli.  Thread içerisinden yaptığım çağrıların hangilerini senrkonize etmeliyim? bunu öğrenmeye çalışıyorum.

t2

#5
gerbay hocam, uygulamalar arası iletişim için daha önce bahsettiğim postmessage ile ilgili  sıkıntı vardı. Başka uygulamaya mesaj gitmeyebiliyordu. galiba windows güvenlik ayarı ile ilgili.  sizde copydata değil de shared memory kullanımını önermiştiniz.


peki thread içinden kendi uygulamasına gönderilecek mesajlarda böyle bir sıkıntı kesin olmaz mı? benim gördüğüm  şöyle bir sorun da var. mesaj alıcısına gitmez ise thread orada donuyor. her mesajı iletmek için ayrıca başka thread açmak gerek. Sorunu görmek için ana thread üzerinde sleep(30000) gibi bir işlem yaptırabiliriz.

Klein

Yok hocam mesajlaşma kullanamıyorum. Bileşenin android üzerinde de çalışması gerekiyor. Androidde mesajlaşma sistemini çözebilmiş değilim.
IdTCPClient'n Bağlantı bekleme ve okuma beklemelerinde sistemi bloke ediyor olması yüzünden thread ile çalışıyorum. Ama bu sorunu bir şekilde çözerim.
IdTCPClient yerine daha temel bir sınıftan türetip, read ve connection kısımlarını kendim yazar, gerekirse bir durum makinesi çalıştırıp hallederim sanırım.

Asıl öğrenmek istediğim Hangi sınıflar VCL sınıfı sorusunun cevabıydı. Onu da öğrendim zaten. Teşekkür ederim.

t43

vcl zaten görsel komponent ilk anda gözükmesi yada gizli olması bir şeyi değiştirmez.
istisnalar da olabilir.kurcalamak lazım.

senkronize olayına gelince ana uygulama run olduktan sonra diğer oluşturduğun thread içine kullanmak istediğin nesneler i referans olarak geçersen o zaman yetki problemi yada senkronize de problem olmaz.en azından ben sıkıntı yaşamadım.ircd sunucusunda 4 portta 200 e yakın makinenin veri aktarımını yaklaşık 400 thread yapıyor.

android üzerinde bende uğraşıyorum.problem yaşarsan yardımcı olmaya çalışırım.