Bir bağlantı noktasını eşzamanlı olarak okurken / yazarken özyinelemeden kaçınmak mı?


108

Rebol 3'teki tüm bağlantı noktası işlemleri eşzamansızdır. Senkronize iletişim kurmanın tek yolu aramaktır wait.

Ancak bu durumda bekleme çağrısı ile ilgili sorun, tüm açık bağlantı noktaları için olayları kontrol edecek olmasıdır (beklemeye geçirilen bağlantı noktası bloğunda olmasalar bile). Daha sonra yanıt veren olay işleyicilerini çağırırlar, ancak bu olay işleyicilerinden birinde bir okuma / yazma yapılabilir. Bu, "bekleme" için özyinelemeli çağrılara neden olabilir.

Bunu nasıl aşarım?


8
Aslında, mevcut R3 uygulamasında buna bir çözüm olduğunu düşünmüyorum, bu yüzden "beklemek" için "/ sadece" ayrıntılandırma eklemeye devam ettim, bununla sadece "beklemek" için sağlanan bağlantı noktalarında bekleyecek. ve böylece yinelemeli aramalardan kaçının. Çekme isteğime
Shixin Zeng

1
Meraktan, neden senkronize olmasına ihtiyacınız var?
toadzky

1
Eşzamanlı bağlantı noktasıyla kodlamanın çok daha kolay olduğu pek çok durum vardır: bir düğmeye tıklayarak bir e-posta göndermek istediğinizi ve başarılı olup olmadığını rapor etmek istediğinizi varsayalım. Başka bir şey yapmadan önce bitmesini beklemek çok daha kolaydır.
Shixin Zeng

1
Rebol'u kesinlikle kullanmak zorunda mısın?
Rivenfall

1
Evet. Bu aslında genel olarak senkronize iletişimden çok Rebol 3 ile ilgili bir sorudur.
Shixin Zeng

Yanıtlar:


1

Eşzamansız girişlerden tüm mesajları almak ve bunları FIFO (ilk giren ilk çıkar) olarak işlemek için neden bir tür "Buffer" işlevi oluşturmuyorsunuz?

Bu şekilde bağlantı noktalarınızın Assync özelliklerini koruyabilir ve bunları eşitleme modunda işleyebilirsiniz.


0

Yalnızca eşzamansız olayların olduğu ve eşzamanlı yanıta ihtiyaç duyduğumuz durumlarda, zaman aşımı için bir zamanlayıcı başlatın veya uyku moduna geçin, işleyici veya gerekli hedef karşılanırsa doğru, yoksa yanlış deyin ve olayın iptal edildiğinden / sıfırlandığından emin olun. kritikse aynı.


0

2 tasarım problemi olduğunu düşünüyorum (belki eldeki araçlara / çözümlere özgü).

  1. Waitçok şey yapıyor - it will check events for all open ports. Sağlam bir ortamda, bekleme yalnızca gerektiği yerde uygulanmalıdır: cihaz başına, bağlantı noktası başına, soket başına ... Paylaşılan kaynaklar arasında gereksiz karşılıklı bağımlılıklar oluşturmak iyi sonuçlanamaz - özellikle de paylaşılan kaynakların (bağımlılıklar olmadan bile) birçok sorun yaratabilir.

  2. Olay işleyicileri olabilir çok fazla yok. Bir olay işleyicisi olabildiğince kısa olmalı ve yalnızca olayı işlemelidir. Eğer daha fazlasını yapıyorsa, işleyici çok fazla şey yapıyor - özellikle diğer paylaşılan kaynakları içeriyorsa. Çoğu durumda, işleyici, aksi takdirde kaybolacak olan verileri kaydeder; ve eşzamansız bir iş daha karmaşık şeyler yapacaktır.


-1

Sadece bir kilit kullanabilirsiniz. Cummunication1 bazı global kilit durumlarını, yani bir değişkenle ayarlayabilir (iş parçacığının güvenli olduğundan emin olun). locked = true. Ardından İletişim2 kilidi açılana kadar bekleyebilir.

loop do
    sleep 10ms
    break if not locked
end
locked = true
handle_communication()

1
Bu aslında genel olarak senkronize iletişimden çok Rebol 3 ile ilgili bir sorudur.
Shixin Zeng
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.