Olaylar için oylama ne zaman gözlemci şablonunu kullanmaktan daha iyidir?


41

Olaylara yönelik oylamanın gözlemci modelini kullanmaktan daha iyi olacağı senaryolar var mı? Oy kullanma korkusuyla karşı karşıyayım ve yalnızca birisi bana iyi bir senaryo verdiyse kullanmaya başlayacağım. Tek düşünebildiğim, gözlemci modelinin yoklamadan daha iyi olduğu. Bu senaryoyu inceleyin:

Bir araba simülatörü programlıyorsunuz. Araba bir nesnedir. Araba açılır açılmaz "vroom vroom" ses klibini oynatmak istiyorsunuz.

Bunu iki şekilde modelleyebilirsiniz:

Yoklama : Açık olup olmadığını görmek için araç nesnesini her saniye sorgulayın . Açık olduğunda, ses klibini oynatın.

Gözlemci modeli : Aracı gözlemci düzeninin konusu yapın. “Açık” etkinliğini, kendisi başladığında tüm gözlemcilere yayınlamasını sağlayın. Aracı dinleyen yeni bir ses nesnesi oluşturun. Ses klibini çalan "açık" geri çağrıyı gerçekleştirmesini sağlayın.

Bu durumda, gözlemci modelinin kazandığını düşünüyorum. İlk olarak, yoklama daha fazla işlemcilidir. İkincisi, araç açıldığında ses klibi hemen patlamaz. Oy verme dönemi nedeniyle 1 saniyeye kadar bir boşluk olabilir.


Neredeyse hiçbir senaryo düşünemiyorum. Gözlemci desen aslında gerçek dünyaya ve gerçek hayata eşleyen şeydir. Bu yüzden hiçbir senaryoyu kullanmamayı haklı çıkarmayacağını düşünüyorum.
Saeed Neamati,

Kullanıcı arayüzü olaylarından mı, yoksa genel olarak olaylardan mı bahsediyorsunuz ?
Bryan Oakley

3
Örneğiniz yoklama / gözlemleme sorununu ortadan kaldırmıyor. Basitçe daha düşük bir seviyeye geçtin. Programınızın, arabanın açık olup olmadığını anlamak için bir mekanizma bulması gerekiyor.
Dunk

Yanıtlar:


55

Her motor devirinden haberdar edilmek istediğinizi düşünün, örneğin sürücüye bir RPM ölçümü görüntülemek için.

Gözlemci düzeni: Motor, her döngü için tüm gözlemcilere bir "motor döngüsü" etkinliği yayınlar. Olayları sayan ve RPM ekranını güncelleyen bir dinleyici oluşturun.

Yoklama: RPM ekranı, motorun motor sayacı için düzenli aralıklarla motorunu sorar ve RPM ekranını buna göre günceller.

Bu durumda, gözlemci paterni muhtemelen gevşeyebilir: motor çevrimi yüksek frekanslı, yüksek öncelikli bir işlemdir, sadece bir ekranı güncellemek için bu işlemi geciktirmek ya da durdurmak istemezsiniz. Ayrıca iş parçacığı havuzunu, motor döngüsü olaylarıyla sıkıştırmak istemezsiniz.


Not: Ayrıca yoklama düzenini dağıtık programlamada sıklıkla kullanıyorum:

Gözlemci düzeni: İşlem A, "işlem E her gerçekleştiğinde, İşlem A'ya bir mesaj gönder" diyen B işlemine bir mesaj gönderir.

Yoklama şekli: İşlem A düzenli olarak B işlemine "son E anketi yaptığım günden beri E olayı gerçekleştirdiyseniz bana bir mesaj gönderin" yazan bir ileti gönderir.

Oylama düzeni biraz daha fazla ağ yükü üretir. Ancak gözlemci modelinin de dezavantajları vardır:

  • İşlem A çökerse, abonelikten çıkmaz ve B süreci, uzaktan işlem hatalarını güvenilir bir şekilde tespit edemediği sürece (yapılacaklar kolay bir şey değil) tüm sonsuzluklar için bildirim göndermeye çalışır.
  • E olayı çok sık görülüyorsa ve / veya bildirimler çok fazla veri içeriyorsa, A işlemi işleyebileceğinden daha fazla etkinlik bildirimi alabilir. Oylama deseni ile yalnızca oylamayı kısabilir.
  • Gözlemci modelinde, yüksek yük, tüm sistemde "dalgalanmalara" neden olabilir. Engelleme soketi kullanıyorsanız, bu dalgalanmalar her iki yöne de gidebilir.

1
İyi bir nokta. Bazen performans uğruna anket yapmak daha iyidir.
Falcon

1
Beklenen gözlemci sayısı da dikkate alınır. Çok sayıda gözlemci beklediğinizde, hepsini gözlemlenen durumdan güncellemek performans darboğazı olabilir. O zaman sadece bir yere bir değer yazmak ve "gözlemcilere" ihtiyaç duyduklarında bu değeri kontrol etmelerini sağlamak çok daha kolay.
Marjan Venema,

1
“uzak işlem arızalarını güvenilir bir şekilde tespit edemediği sürece (yapılması kolay bir şey değil)” ”... yoklama hariç; P. Bu yüzden en iyi tasarım mümkün olduğunca "hiçbir şey değişmedi" yanıtını en aza indirmektir. +1, iyi cevap.
pdr,

2
@Jojo: Evet, yapabilirsin, ama o zaman ekranda görünmesi gereken politikayı RPM sayacına koyuyorsun. Belki de kullanıcı zaman zaman oldukça hassas bir RPM ekrana sahip olmak ister .
Zan Lynx,

2
@JoJo: Her 100. etkinliğin yayınlanması bir hack. Yalnızca olay frekansı her zaman doğru aralıktaysa, olayın işlenmesi motor için çok uzun sürmezse, tüm abonelerin karşılaştırılabilir doğruluklara ihtiyacı varsa işe yarar. Ve (birkaç bin RPM varsayalım) CPU için saniyede birkaç yoklama işleminden çok daha fazla çalışma olduğu varsayılarak, RPM başına bir modül işlemi gerekir.
nikie,

7

Oylama işlemi, oy verme işleminden önemli ölçüde daha yavaş çalışırsa, sorgulama daha iyidir. Olayları bir veritabanına yazıyorsanız, tüm olay üreticilerinizi yoklamak, son anketten bu yana meydana gelen tüm olayları toplamak ve daha sonra bunları tek bir işlemde yazmak daha iyi olur. Her olayı olduğu gibi yazmaya çalıştıysanız, devam edemeyebilirsiniz ve sonuçta girdi sıralarınız dolduğunda sorun yaşarsınız. Ayrıca, gecikmenin yüksek olduğu veya bağlantı kurulmasının ve yırtılmasının pahalı olduğu gevşek bağlantılı dağıtılmış sistemlerde daha anlamlı olur. Yoklama sistemlerinin yazılmasını ve anlaşılmasını daha kolay buluyorum, ancak çoğu durumda gözlemciler veya olaya dayalı tüketiciler daha iyi performans gösteriyor gibi görünüyor (deneyimlerime göre).


7

Yoklama, bağlantılar başarısız olduğunda, sunucular yapılabilir, vb. Bir üzerinden çalışmak çok daha kolaydır. Bir TCP soketinin bir "yoklama" iletisine ihtiyacı olduğunu unutmayın. Aksi takdirde sunucu istemciyi kabul eder. uzağa gitti.

Yoklama, bir kullanıcı arayüzünü güncel tutmak istediğinizde de iyidir, ancak altta yatan nesneler çok hızlı değişir , çoğu uygulamada kullanıcı arayüzünü saniyede birkaç defadan fazla güncellemenin bir anlamı yoktur.

Sunucunun çok düşük bir maliyetle “değişiklik yapmamaya” yanıt vermesi ve çok sık anket yapmamanız ve 1000'den fazla müşterinin yoklama alması durumunda, yoklama gerçek hayatta çok iyi çalışıyor.

Ancak “ bellekte ” durumlarda, normalde en az iş olduğu için gözlemci desenini varsayılan olarak kullanıyorum.


5

Yoklama bazı dezavantajlara sahip, temelde onları zaten sorunuzda belirtti.

Ancak, gözlemcileri herhangi bir gözlemciden gerçekten ayırmak istediğinizde daha iyi bir çözüm olabilir. Ancak bazen, bu gibi durumlarda gözlemlenecek nesne için gözlemlenebilir bir sargı kullanmak daha iyi olabilir.

Yalnızca gözlemlenebilir nesneler ile gözlemlenemediğinde, örneğin genellikle geri arama alamadığınız durumlarda veritabanlarını sorgularken olduğu gibi sorgulama kullanırım. Başka bir konu, eşzamanlılık sorunlarından kaçınmak için doğrudan nesneleri çağırmak yerine mesajları sorgulamanın ve işlemenin genellikle güvenli olduğu yerlerde çok iş parçacıklı olabilir.


Oylamanın neden çoklu iş parçacığı için daha güvenli olduğuna inandığınızdan emin değilim. Çoğu durumda, bu böyle olmaz. Yoklama işleyicisi bir yoklama isteği aldığında, yoklama nesnesinin durumunu bulmak zorunda kaldı, eğer nesne güncelleme ortasındaysa, yoklama işleyicisi için güvenli değil. Dinleyici senaryosunda, yalnızca itici tutarlı durumdaysa bildirim alırsınız; böylece yoklamalı nesnede çoğu senkronizasyon sorununu önleyebilirsiniz.
Yalan Ryan,

4

Yoklama bildirimden ne zaman devralınırsa iyi bir örnek için, işletim sistemi ağ yığınlarına bakın.

Ağ yığını, sürücülerin kesme modundan (bildirimden) yoklama moduna geçmesine izin veren bir ağ API'si olan NAPI'yi etkinleştirmesi Linux için çok önemliydi.

Birden fazla gigabit Ethernet arayüzünde, kesintiler genellikle CPU'yu aşırı yükleyerek sistemin gerekenden daha yavaş çalışmasına neden olur. Çağırma ile ağ kartları, çağrılana kadar arabelleklerde paket toplarlar ya da kartlar bile paketleri DMA aracılığıyla belleğe yazar. Ardından işletim sistemi hazır olduğunda kartı tüm verileri için yoklar ve standart TCP / IP işlemlerini yapar.

Oylama modu, CPU'nun gereksiz veri yüklemesi olmadan Ethernet verilerini maksimum işlem hızında toplamasını sağlar. Kesme modu, iş bu kadar meşgul olmadığında CPU'nun paketler arasında boşta çalışmasına izin verir.

İşin sırrı, bir moddan diğerine ne zaman geçileceğidir. Her modun avantajları vardır ve uygun yerde kullanılması gerekir.


2

Oylamayı seviyorum! Ben mi Evet! Ben mi Evet! Ben mi Evet! Hala mı Evet! Peki ya şimdi? Evet!

Diğerlerinin de belirttiği gibi, yalnızca aynı değişmemiş durumu tekrar tekrar geri almak için anket yaparsanız, inanılmaz derecede verimsiz olabilir. Bu, CPU çevrimlerini yakmak ve mobil cihazlarda pil ömrünü önemli ölçüde kısaltmak için bir reçetedir. Elbette, her seferinde istenenden daha hızlı olmayan bir oranda yeni ve anlamlı bir durum elde ediyorsanız, israf olmaz.

Ancak anket yapmayı sevdiğim ana sebep sadeliği ve tahmin edilebilir doğasıdır. Kod boyunca izleyebilir ve ne zaman ve nerede olayların olacağını ve hangi konudaki konuları kolayca görebilirsiniz. Teorik olarak, yoklamanın ihmal edilebilir bir atık olduğu bir dünyada yaşıyor olsaydık (gerçekliğin ondan uzak olmasına rağmen), kodun çok büyük bir anlaşmayı korumayı kolaylaştıracağına inanıyorum. Ve bu durumda olmamamız gerekse de performansı göz ardı edip edemeyeceğimizi gördüğüm gibi oy kullanmanın ve çekmenin yararı bu.

DOS döneminde programlamaya başladığımda, küçük oyunlarım oylama etrafında dönüyordu. Bazı montaj kodlarını, klavye kesintileriyle ilgili zorlukla anladığım bir kitaptan kopyaladım ve ana halimin her zaman sorgulayacağı bir klavye durumu tamponu depolamasını sağladım. Yukarı tuşu aşağı mı? Hayır! Yukarı tuşu aşağı mı? Hayır! Şimdi nasıl? Hayır! Şimdi? Evet. Tamam, oynatıcıyı oynat.

İnanılmaz derecede boşa giderken, bu çok görevli ve etkinlik odaklı programlamaya kıyasla aklınıza gelmesi çok daha kolay. Her zaman ne zaman ve nerede olacağını tam olarak biliyordum ve kare hızlarını hiccup olmadan istikrarlı ve öngörülebilir tutmak daha kolaydı.

O zamandan beri, CPU döngülerini gerçekten yakmadan, bazı avantajları ve öngörülebilirliğini elde etmenin bir yolunu bulmaya çalıştım, örneğin, yeni durumu hangi noktada uyandırmaları gerektiğini bildiren konuları bildirmek için koşul değişkenleri kullanmak gibi, işlerini yap ve tekrar haber bekliyorum uyu.

Ve her nasılsa olay sıralarını en azından gözlemci modelleriyle çalışmaktan çok daha kolay buluyorum, yine de nereye gideceğinizi ya da neyin sona ereceğini tahmin etmeyi o kadar kolay hale getirmese de. En azından olay işleme kontrol akışını sistemdeki birkaç kilit alana merkezileştirir ve bir olaydan tamamen uzak bir yere sıçramak yerine bu olayları her zaman aynı iş parçasında tutar ve merkezi olay işleme iş parçasının aniden dışında beklenmedik bir şekilde bekler. Dolayısıyla, ikilik her zaman gözlemciler ve oylama arasında olmak zorunda değildir. Olay sıraları orada bir çeşit orta yol.

Ama evet, bir şekilde, yıllar önce oylama yaparken kullandığım tahmin edilebilir kontrol akışlarının türüne yakın olan şeyleri yapan sistemler için mantıklı olmanın çok daha kolay olduğunu düşünüyorum. durum değişikliği olmadığı zamanlar. Dolayısıyla, işlem değişkenlerini, koşul değişkenleri gibi gereksiz bir şekilde yazmayan bir şekilde yapabiliyorsanız, bu fayda var.

Homojen Döngüler

Pekala, Josh Caswellcevabımdaki bazı saçmalıklara dikkat çeken harika bir yorum aldım :

"uyanmak üzere konuları bildirmek için koşul değişkenleri kullanmak gibi" Yoklama değil, olay tabanlı / gözlemci düzenlemesi gibi görünüyor

Teknik olarak, koşul değişkeninin kendisi, ipleri uyandırmak / bildirmek için gözlemci modelini uygulamaktır; bu nedenle, "oylama" muhtemelen inanılmaz derecede yanıltıcı olacaktır. Ancak, DOS günlerinden sorgulama olarak bulduğum benzer bir fayda sunduğunu düşünüyorum (sadece kontrol akışı ve öngörülebilirlik açısından). Daha iyi açıklamaya çalışacağım.

O günlerde dikkatimi çeken şey, bir kod bölümüne bakabilmeniz ya da izleyebilmeniz ve "Tamam, tüm bu bölüm klavye olaylarını işlemeye adanmış. Kodun bu bölümünde başka hiçbir şey olmayacaktı. Ve daha önce ne olacağını tam olarak biliyorum ve sonrasında tam olarak ne olacağını biliyorum (örneğin fizik ve render). Klavye durumlarının oylanması, bu harici olaya yanıt olarak ne yapılması gerektiğiyle ilgili olarak kontrol akışının bu tür bir merkezileşmesini sağladı. Bu dış olaya hemen cevap vermedik. Size uygun olan şekilde cevap verdik.

Bir Gözlemci desenine dayanan itme tabanlı bir sistem kullandığımızda, genellikle bu avantajları kaybediyoruz. Bir resize olayını tetikleyen bir kontrol yeniden boyutlandırılabilir. Bunu takip ettiğimizde, yeniden boyutlandırmada daha fazla olay tetikleyen birçok özel şey yapan egzotik kontrolün içinde olduğumuzu görüyoruz. Sistemin neresinde olduğumuzla ilgili tüm bu basamaklı olayları takip ederken tamamen şaşırıyoruz. Ayrıca, tüm bunların, herhangi bir iş parçacığında tutarlı bir şekilde meydana gelmediğini görebiliriz, çünkü iş parçacığı A burada bir denetimi yeniden boyutlandırabilirken, iş parçacığı B daha sonra bir denetimi yeniden boyutlandırır. Bu yüzden, her şeyin nerede olacağını ve ne olacağını tahmin etmenin ne kadar zor olduğunu göz önünde bulundurarak bunu her zaman zor buldum.

Olay sırası benim için biraz daha basit, çünkü bu şeylerin en azından bir iş parçacığında nerede gerçekleştiğini kolaylaştırıyor. Ancak, birçok farklı şey olabilir. Bir olay kuyruğu, işlenecek olayların eklektik bir karışımını içerebilir ve her biri bizi hangi olayların meydana geldiği, işlenme sırasını ve kod tabanındaki her yere nasıl sıçradığımızla ilgili bizi hala şaşırtabilir. .

Oy vermeye "en yakın" olduğunu düşündüğüm şey bir olay kuyruğu kullanmayacak, ancak çok homojen bir işleme türünü erteleyecek. Bir PaintSystempencerenin belirli ızgara hücrelerini yeniden boyamak için boyama işi yapılması gereken bir durum değişkeni ile uyarılmış olabilir, bu noktada hücreler arasında basit bir sıralı döngü yapar ve içindeki her şeyi uygun z sırayla yeniden boyar. Yeniden boyanması gereken bir hücrede bulunan her widget'taki boyama olaylarını tetiklemek için burada tek bir düzeyli dolaylı / dinamik gönderme olabilir, ancak bu - dolaylı çağrıların sadece bir katmanı. Koşul değişkeni, PaintSystemyapması gereken işleri olduğunu bildirmek için gözlemci düzenini kullanır , ancak bundan daha fazlasını hiçbir şey belirtmez.PaintSystemBu noktada bir üniforma, çok homojen bir göreve adamıştır. Hata ayıklama ve PaintSystem'skodu takip ederken , resim dışında başka hiçbir şeyin olmayacağını biliyoruz.

Bu yüzden, çoğunlukla, olay sırasındaki işlemlerle alabileceğimiz sayısız sorumluluk alan farklı veri türleri üzerindeki homojen olmayan döngüler yerine, üzerine çok tekil bir sorumluluk uygulayan veriler üzerinde homojen döngüler yapan bu şeylerin bulunduğu yere gitmenizle ilgilidir.

Bu tür bir şeyi hedefliyoruz:

when there's work to do:
   for each thing:
       apply a very specific and uniform operation to the thing

Aksine:

when one specific event happens:
    do something with relevant thing
in relevant thing's event:
    do some more things
in thing1's triggered by thing's event:
    do some more things
in thing2's event triggerd by thing's event:
    do some more things:
in thing3's event triggered by thing2's event:
    do some more things
in thing4's event triggered by thing1's event:
    cause a side effect which shouldn't be happening
    in this order or from this thread.

Ve bunun gibi. Ve görev başına bir iplik olmak zorunda değildir. Bir iş parçacığı GUI denetimleri için mizanpajlar (yeniden boyutlandırma / yeniden konumlandırma) mantığı uygulayabilir ve bunları yeniden boyayabilir, ancak klavye veya fare tıklamaları ile ilgilenmeyebilir. Böylece, buna bir olay sırasının homojenliğini iyileştirmek için bakabilirsiniz. Ancak bir olay sırası kullanmak zorunda değiliz ve yeniden boyutlandırma ve boyama işlevlerini birleştirelim. Biz yapabiliriz:

in thread dedicated to layout and painting:
    when there's work to do:
         for each widget that needs resizing/reposition:
              resize/reposition thing to target size/position
              mark appropriate grid cells as needing repainting
         for each grid cell that needs repainting:
              repaint cell
         go back to sleep

Bu yüzden yukarıdaki yaklaşım sadece yapılması gereken iş olduğunda ipliği bildirmek için bir koşul değişkeni kullanır, ancak farklı olay türlerini birleştirmez (bir döngüde yeniden boyutlandır, başka bir döngüde boya, her ikisinin karışımı değil) ve İşin tam olarak yapılması gereken şeyin ne olduğunu bildirmekten rahatsız olmayın (iş parçacığı, ECS'nin sistem genelindeki durumlarına bakarak uyandıktan sonra bunu "keşfeder"). Gerçekleştirdiği her döngü daha sonra doğada çok homojendir, bu da her şeyin gerçekleştiği sıraya göre karar vermeyi kolaylaştırır.

Bu tür bir yaklaşıma ne diyeceğimi bilmiyorum. Başka GUI motorlarının bunu yaptığını görmedim ve bu benimkine kendi egzotik yaklaşımım. Fakat gözlemcileri veya olay kuyruklarını kullanarak çok iş parçacıklı GUI çerçevelerini uygulamaya koymaya başladığımda, hata ayıklama konusunda muazzam bir zorluk yaşadım ve kendimi güvende hissettirecek şekilde düzeltmek için yeterince akıllı olmadığım bazı belirsiz yarış koşullarına ve çıkmaza girdim çözüm hakkında (bazı insanlar bunu yapabilir olabilir ama yeterince akıllı değilim). İlk yineleme tasarımım doğrudan bir sinyal yoluyla doğrudan bir yuva olarak adlandırıldı ve bazı yuvalar daha sonra zaman uyumsuzluk çalışması için diğer iş parçacıkları ortaya çıkardı ve bu akla gelmesi en zor olan şeydi ve yarış koşulları ve çıkmazlar yüzünden takılıyordum. İkinci yineleme bir olay kuyruğu kullandı ve bunun nedeni biraz daha kolaydı. ama beynimin hala belirsiz çıkmaza girme ve yarış koşullarına girmeden yapması için yeterince kolay değil. Üçüncü ve son yineleme, yukarıda açıklanan yaklaşımı kullandı ve sonunda benim gibi aptal bir bastonun bile doğru bir şekilde uygulayabileceği çok iş parçacıklı bir GUI çerçevesi oluşturmamı sağladı.

Daha sonra bu son derece iş parçacıklı GUI tasarımı, aklıma gelmek için çok daha kolay olan ve yapma eğiliminde olduğum bu türden hatalardan kaçınmak için çok daha kolay olan başka bir şey bulmama izin verdi. en azından bu homojen döngülerden kaynaklanıyorlar ve DOS günlerinde oylama yaptığım zamana benzer şekilde kontrol akışına benziyorlardı (gerçekten oylama yapmıyor ve sadece yapılacak işler varken iş yapıyor olsalar bile). Fikir, homojen olmayan döngüler, homojen olmayan yan etkiler, homojen olmayan kontrol akışları ve homojen veri üzerinde homojen bir şekilde çalışan homojen döngülere doğru daha fazla çalışmak için olay işleme modelinden mümkün olduğunca uzağa hareket etmekti. ve yan etkilerin sadece "neye" odaklanmayı kolaylaştıran şekillerde birleştirilmesi


1
"uyanmak üzere konuları bildirmek için koşul değişkenlerini kullanmak gibi" Yoklama değil, olaya dayalı / gözlemci düzenlemesi gibi geliyor.
Josh Caswell

Farkı çok belirsiz buluyorum ama bildirim sadece konuları uyandırmak için "Yapılması gereken işler var" şeklinde. Örnek olarak, bir gözlemci modeli, bir üst kontrolün yeniden boyutlandırılması üzerine, basamaklı yeniden boyutlandırma çağrıları dinamik gönderme kullanarak hiyerarşide aramaları yapabilir. Her şey dolaylı olarak derhal çağrılan resize olay fonksiyonlarına sahip olacaktır. O zaman hemen kendilerini yeniden boyayabilirler. Sonra bir olay kuyruğu kullanırsak, bir üst kontrolün yeniden boyutlandırılması, yeniden boyutlandırma olaylarını hiyerarşide aşağıya itebilir, bu noktada her kontrol için yeniden boyutlandırma işlevleri ertelenmiş bir şekilde çağrılabilir, bu durumda ...

... o zaman, her şey yeniden boyutlandırma bittikten sonra ve hepsi merkezi bir olay işleme başlığından ertelenen bir şekilde çağrılan yeniden boyama olaylarını yeniden bastırabilirler. Ve ben merkezileşmenin, en azından hata ayıklama ve işlemin gerçekleştiği yer hakkında kolayca aktarabilmeye kadar ne kadar yararlı olduğunu buluyorum (hangi ipliği de dahil olmak üzere) ... O zaman sorgulamaya en yakın olmayı düşündüğümden hiçbiri bu çözümler ...

Örneğin, LayoutSystemnormalde uyuyan bir şeye sahip olur, ancak kullanıcı bir kontrolü yeniden boyutlandırdığında, uyandırmak için bir koşul değişkeni kullanır LayoutSystem. Sonra LayoutSystemgerekli tüm kontrolleri yeniden boyutlandırır ve uykuya geri döner. Bu işlemde, aletlerin içinde bulunduğu dikdörtgen bölgeler, güncellemelere ihtiyaç duyuyor olarak işaretlendi, bu noktada bir PaintSystemuyanır ve bu dikdörtgen bölgelerden geçerek düz bir sıralı ilmek halinde yeniden çizilmesi gerekenleri yeniden boyar.

Bu nedenle, koşul değişkeninin kendisi, uyanmaları için konuları bildirmek için bir gözlemci modelini takip eder, ancak “yapılacak işler var” dan daha fazla bilgi iletmiyoruz. Ve uyanan her sistem, homojen olmayan görevleri olan bir olay sırasının aksine (homojen olmayan bir olaylar karışımı içerebilir), homojen bir görev uygulayan çok basit bir döngüde olayları işlemeye adanmıştır.

-4

Gözlemci bilmece hakkında kavramsal olarak düşünmenin yolu hakkında size genel bir bakış veriyorum. Youtube kanallarına abone olmak gibi bir senaryo düşünün. Kanala abone olan çok sayıda kullanıcı var ve bir keresinde, bir çok videodan oluşan kanalda herhangi bir güncelleme yapılacak ve aboneye bu kanalda bir değişiklik olduğu bildirildi. Bu yüzden eğer kanal abone olma kabiliyetine sahip SUBJECT ise kanala kayıtlı tüm OBSERVER aboneliklerini iptal et ve bildir.


2
Bu, sorulan soruları ele almaya bile kalkışmaz, ne zaman olaylar için oylama gözlemci modeli kullanmaktan daha iyidir? Bkz Cevap Nasıl
tatarcık
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.