2010-09-16 15 views
13

WPF'de gerçek zamanlı çok iş parçacıklı bir uygulama yapıyorum, ancak UI'yi güncellemede zorluk yaşıyorum.WPF Real Time Multithreaded Stok Ticaret Uygulaması

Pazarda hangi işlemlerin gönderileceğini belirleyen bir mantık içeren bir arka plan iş parçacığım var. Piyasaya geçerli bir ticaret gönderildiğinde, ana uygulama penceremdeki etkinlikler aracılığıyla bu işlemlerde durum güncellemeleri alıyorum. Gerçek zamanlı fiyat güncellemeleri aldığım başka etkinliklerim var.

Bu olaylar aracılığıyla, UI'yi destekliyorum. Şimdi, uygulama içinden çok hızlı bir şekilde olayları aldığımı, UI'nin olayların alındığı hıza ayak uyduramayacağını ve UI'nin yavaşça güncellenmesine veya hiç güncellenmemesine neden olduğunu görüyorum. Esasen UI donuyor. Tüm olaylar tetiklendikten sonra, kullanıcı arayüzü yavaşça tekrar yanıt verir. Tamamen duyarlı olduğunda, kullanıcı arayüzü beklediğim verileri gösterir.

Soruma göre, UI olayları aldığım kadar hızlı bir şekilde gerçek zamanlı olarak güncelleştirmeyi nasıl sağlayabilirim? Bir süredir bununla uğraşıyorum, bu yüzden herhangi bir yardım takdir edilecektir.

Şimdiden teşekkürler!

cevap

11

İşçi iş parçacığı yerine, UI iş parçacığına yapılan güncelleştirmeleri UI iş parçacığına iletmek yerine, düzenli aralıklarla UI iş parçacığı çekme (veya yoklama) düşünün. İtme yöntemi pek çok durumda iyidir, ancak size karşı çalışan iki büyük dezavantaja sahiptir.

  • güvenli bir şekilde kullanıcı arayüzü güncelleştirmelerini gerçekleştirmek için bir yöntemin yürütülmesine aktardığında yerde pahalı bir dizme işlemi yoktur (en azından olmalıdır).
  • İşçi iş parçacığı, UI'nin ne sıklıkta güncellenmesi gerektiğini ve ne kadar çalışma yapması gerektiğini açıklar. Mesaj pompasını kolayca boğabilir.

I iş parçacığı güncelleme ve sıradan çıkarma ve işleyecek UI iş parçacığı içeren bir veri yapısı kuyruğa olan ortak bir sıra kullanılmasını önerirler. UI iş parçacığının, stratejik olarak seçilen bir aralıkta sırayla sorgulanmasına neden olabilir, böylece hiçbir zaman rahatsız edilmez. Sıra, UI ileti pompası yerine arabellek görevi görür. Ebb ve akış miktarı güncellendikçe küçülecek ve büyüyecektir. İşte bahsettiğim şeyin basit bir diyagramı.

[Worker-Thread] -> [Queue] -> [UI-Thread] 

Ben ilk basit kuyruk yaklaşımıyla başlayacağını, ancak güncellemeleri akışı katılan 3 konu vardır ki bir boru hattı oluşturma sonraki adım için bu sürebilir. Çalışan iş parçacığı güncellemeleri algılar ve kullanıcı arayüzü iş parçacığı daha önce olduğu gibi onları dequeues. Ancak, sıraya bekleyen güncelleme sayısını yöneten ve yönetilebilir bir boyutta tutan karışıma yeni bir iş parçacığı eklenebilir. Kuyruk küçük kalırsa tüm güncellemeleri ileterek bunu yapar, ancak güvenli moda geçer ve makul bir birleştirme işlemi tanımlanabiliyorsa, yaşamakta olduğunuz güncellemeleri atmadan veya bir araya getirmeye başlar. İşte bu kalıbın nasıl çalışabileceğinin basit bir diyagramı.

[Worker-Thread] -> [Queue-1] -> [Pipeline-Thread] -> [Queue-2] -> [UI-Thread] 

Yine, basit bir sıra yaklaşımı ile başlayın.Daha fazla kontrole ihtiyacınız varsa, boru hattı modeline geçin. Her ikisini de başarılı bir şekilde kullandım.

+0

Fantastik Teşekkürler Brian. Bu benim aradığım cevap. Özetle, yükseltilmiş olayların kullanıcı arayüzünü güncellemesine izin vermek yerine, sıraya koyup sıraya göre bu güncellemeleri düzenli aralıklarla çıkaran ve kullanıcı arayüzünü güncelleyen bir zamanlayıcıya sahip olursunuz. Bu şekilde UI kontrolünüzde güncellenir ve zamanlayıcı aralığı ihtiyaçlarma göre ayarlanabilir. – c0D3l0g1c

+0

Tam olarak! UI, çalışan iş parçacığına olan sorumluluğu kapatmak yerine güncellemeye hazır olduğunda dikte bıraksın. –

7

Muhtemelen alınan olayları bir GUI güncellemesiyle sonuçlanan her kene ile sonuçlanmayacak şekilde birleştirmeniz gerekir. GUI'niz zaten güncelleniyorsa onları toplayın ve GUI işlemini bir sonraki partiye yalnızca hazır olduğunda verin. Eğer besleme yüksek hacimli ise (çoğu zaman aktif ticari veri güncellemelerinde olduğu gibi), her bir kene kendi kendine yeten yenileme tetiği olarak yansıtan bir GUI oluşturamayacaksınız.

+0

+1, genellikle, ünite başına UI iş parçacığına yalnızca sınırlı sayıda ayrı çağrı yapabilir ve yanıt vermeden durabilir - belirli aralıklarla UI listeleri gibi öğelerin toplu güncelleştirmelerini de yapabilir. ^^ –