2010-01-19 19 views
6

İşte benim sorunum: Bir aygıtın seri üzerinden gönderilip alınabilmesi gerekiyor. Bunun çok iş parçacıklı bir şekilde yapılması gerekiyor. şöyle akışıdır: cihaz içinAygıtlarla Konuşmak İçin Üretici/Tüketici Serially

  1. bekleyin bana bir şey göndermek için - Cihaz bana sonra bir şey, süreç mesajı gönderirse veya boşta, o cihaz ile İnternet'te olmadığını görmek için durumu sorgulamak

  2. , kabul ve bir iş parçacığı almak ve iletmek dişe sahip, Şu anda

gerekli

gibi diğer komutları gerçekleştirmek için cihazı söyle. Alma iş parçacığı, bir bayt için ReadFile (...) aracılığıyla seri bağlantı noktasını denetlemeye devam eden bir süre döngüsüne sahiptir. Eğer bir baytım varsa, arabamı oluşturmaya başlıyorum ve sonra bana neyin gönderildiğini belirlemek için verileri ayrıştırıyorum.

Gönderme iş parçacığı, okuma iş parçacığı tarafından tanımlanan sonraki komutu alır ve WriteFile aracılığıyla aynı COM bağlantı noktasına gönderir. Anahtar, kendimle cihaz arasında bir alma/gönderme ilişkisi olmasıdır.

Sorum şu ki, iç içe geçmiş bir Üretici/Tüketici modelim var mı? Alma iş parçacığım aygıttan geliyorsa ve ileti dizisi cihaza üretiyorsa, iş parçacıklarının doğal olarak konuşması gerekir, böylece senkronizasyon sağa mı? Çabalarımı verimli ve hızlı bir şekilde cihazla konuşmam için en iyi yol hangisidir? Not: TThreads içeren C++ Builder 5 kullanıyorum ve kritik bölümleri ve muteksleri kullanabiliyorum.

Düzenleme: Ben de yoklama kullanıyorum, bu yüzden daha iyi çalışırsa WaitCommEvent kullanarak açmak için kullanıyorum!

cevap

1

Senkronize etmeniz gerektiğini düşündüğünüz kaynakları hangi kaynakları paylaşıyorsunuz?

İki iş parçacığı arasında bir sıraya sahipseniz, o zaman bu oldukça klasik bir yapımcı/tüketici modelidir. ÖRNEĞİN. Başka bir iş parçacığı kuyruğundan çıkarılırken, bir iş parçacığına sahip bir kuyruğa sahip olmanız ve sonra sıraya komutlar koymanız, komutu işler ve aygıta yazarsa, bir muteks veya semafor ile sıranıza erişimi eşitlemeniz gerekir.

Belki de bir şeyleri özlüyorum ama kuyruktan okunan birden çok ileti parçacığınız varsa ve iletilmesi gereken komutların sırayla kalması gerekiyorsa bu yalnızca karmaşıklaşmalıdır. Bu yüzden basit tutmaya çalışın.

+0

Doğru, ancak, aygıtı okumaya nasıl eşitleyebilirim, böylece okuduğumda yazmıyor muyum? Küresel bayrak? –

+0

Bunu yapmak zorunda olduğunuzdan emin misiniz? Eğer öyleyse okuma/yazma işlemlerini senkronize etmek için bir semafor kullanabilirsiniz. Bu http://stackoverflow.com/questions/1488712/is-it-safe-to-read-and-write-to-a-serial-port-at-the-same-time-via-different-thre olabilir faydalı. – Duck

İlgili konular