2012-07-25 22 views
10

Doğru kodlamada bazı önerilere ihtiyacım var:İyi Kodlama? (Çoklu Mesaj Döngüler)

Birden çok seri bağlantının kullanıldığı bir program üzerinde çalışıyorum. Her iletişim hattında bir soyutlama katmanı olarak çalışan bir kontrolör vardır. Kontrolör ve seri port arasında, veriyi paketlere hazır hale getirmek için transfer için hazır bir protokol eklenir. Protokol başarısız teslimatlar ile ilgilenir, yeniden gönderme vb. GUI'nin askıda kalmamasını sağlamak için, her bağlantı hattı (protokol ve seri bağlantı noktası) ayrı bir iş parçacığı üzerinde oluşturulur. Denetleyici, ana iş parçacığı tarafından işlenir, çünkü GUI'de denetimler vardır.

Şu anda, iş parçacığı oluşturduğumda, onlara bir ileti döngüsü oluşturmayı seçtim (Application.Run()), bunun yerine arabellekleri yoklamak ve herhangi bir işin olmaması durumunda, yalnızca iş parçacığı (BeginInvoke) çağırır ve kullanır ileti döngüsü bir arabellek olarak. Bu şu anda güzel çalışıyor ve şu ana kadar ciddi bir sorun yok.

Soruma şimdi bakıyorum: Bu "iyi kodlama" mı, yoksa sırtta bir süre döngü kullanmalı ve bunun yerine tamponlar mı kullanmalıyım ?, yoksa üçüncü bir şey mi?

Kodu göstermek istiyorum, ancak şu ana kadar birkaç bin satırlık kod var, bu nedenle kodun herhangi bir bölümünü görmeniz gerekiyorsa lütfen belirtin. :)

Teşekkür ederiz. Uygulamanız boştayken

cevap

4

Her iş parçacığındaki ileti döngülerini kullanmak gayet iyi; Windows bu senaryo için optimize edilmiştir. Yoklamadan kaçınmaya hakkınız vardır, ancak daha etkin olan diğer etkinlik tabanlı tasarımlara bakmak isteyebilirsiniz, örneğin, bir aktarım için bir paket hazırlamak ve SetEvent numaralı telefonu, hazır olduğu bir iş parçacığı veya semafor ve iş parçacığı güvenli sırayı bildirmek için Martin James önerdi.

+0

Pek yok, hayır. WM_COPYDATA süreçler arasında iletişim kurmak için iyidir. Tek bir süreç içinde ileti dizileri için bunu kullanmak anlamsız. Tampon/blob/herhangi bir nesneyi işaretçiden geçirmeniz çok daha kolay/basittir, örn. * Buffer'ı mesaja göndererek.lParam, PostMessage() 've' diğer ucuna 'geri dönün. –

+0

Windows ileti sıraları, GUI iş parçacıklarının iletilmesi için en uygun hale getirilmiştir. GUI iş parçacıklarından GUI olmayan iş parçacıklarına iletişim için uygun değildir. Basit bir semafor bazlı, optimize edilmemiş üretici-tüketici kuyruğu bile bir WMQ'dan yaklaşık dört kat daha hızlıdır. Çoğu uygulamada, P-C sıra performansı normalde bir sorun değildir. –

+0

Aslında iki noktada da aynı fikirdeyim. WM_COPYDATA düzenleyeceğim; Açıkça düşünmüyordum. Bununla birlikte mesaj sırasına göre, genelleştirilmiş bir olay tabanlı çözümdür. Uygulamasının gereksinimlerine bağlı olarak, diğer modeller daha iyi olabilir. – tenfour

1
Ben, (hayır haberleşme), :)

kötü o gelmiyor 'İçeri dolum' bir parça, burada ne ama ne% 100 emin olduğunu ediyorum

CPU% 0 kullanıyor mu?

Uygulamanız uykusuz (0)/uyku (1) veya benzer yoklama döngüleri mi?

Makul derecede düşük gecikme ile çalışıyor mu? cevaplar üç iseniz

'EVET', ince olmalıdır :)

vardır birkaç, (çok az!) vb sonuçlar için yoklama iyi bir fikirdir, (olduğu durumlar örn. zaman iş parçacıklarındaki olayların frekansı o kadar yüksektir ki, her ilerleme olayını GUI'ye bildirirdi, ancak çoğunlukla, sadece zayıf bir tasarımdır.

+0

Bu programın amacı, her biri bir Arduino içeren 1-4 (şimdiye kadar) kutuları kontrol etmektir. Her Arduino, bir simülatör sisteminin dijital I/O'larına bağlanır. Paralel simülatör sistemlerinin bir kutu pr. simülatör. Simülatörler çalıştığım şirketteki Ar-Ge'nin bir parçasıdır. Windows programı, Arduino pinout'larını çalışma zamanında yeniden programlayabilme kabiliyetine sahip olup, pinlerin yüksek/düşük durumlarını okuma/yazma ile birlikte. – Anders

+0

Üçlü YES buradan .. Arabayı yoksaymak için kod değiştirmeyi denedim, veri yok ise thread.yields ve bu programın biraz eksik olmasından dolayı, sanırım mesaj döngüleri ile iyiyim :) – Anders

+0

Peki, Biraz farklı kuyruklar vb. Kullanmış olabilirim, fakat eğer uygulama yeterince verimliyse, çabuk cevap veriyor ve çarpmıyor, kimin umurunda :)) –

İlgili konular