Problem jest taki:
w głównym wątku aplikacji mam listę obiektów, do której chcę co jakiś czas dodawać obiekty tworzone w oddzielnym wątku.
Jak to zrealizować? Wydaje mi się, że to jest prosty przypadek producenta/konsumenta, ale jakoś przykładowe kody realizujące ten problem nie bardzo mi pasują do aplikacji...
Google: mutexy semafory
Akurat w c# nie korzystatalem z wielowatkowosci, ale implementacja tego co wyzej napisalem nie powinna sprawic zadnych problemow w tym jezyku.
No właśnie - czytałem, googlowałem, sprawdzałem programy z laborek sprzed lat i nie wiem po co mi semafory, jeśli mam tylko jeden wątek generujący te obiekty a drugi ma je odczytywać i dodawać do listy.
No i bardziej mi chodzi o sposób przekazania tego obiektu do innego wątku.
Semafory i mutexy to bardziej c/c++ :)
W C# korzystasz z:
lock (<object>) <---- w tym wypadku Twoja kolekcja
.... dodajesz
W C# 4.0 masz specjalne kolekcje do tego:
http://jiezhu0815.blogspot.com/2010/08/c-40-feature-1-concurrent-collections.html
ewentualnie: SynchronizedCollection<T> w System.Collections.Generic
Na pewno cos znajdziesz.
Sporo zalezy od tego co i jak dodajesz - ciężko mi podpowiedzieć po takim ogólniku...
No to od początku:
W klasie Form1 głównego okna aplikacji dodałem pole
public LimitedList<DataFrame> dataFramesList;
Ta klasa LimitedList dziedziczy po List i jedyną jej różnicą jest to, że jest ograniczona do określonej ilości elementów a po jej przekroczeniu przy dodawaniu nowego pierwszy element jest usuwany.
W konstruktorze Form1 tworzę obiekt Thread:
deviceReader = new DeviceReader();
deviceReaderThread = new Thread(new ThreadStart(deviceReader.ReadDevice));
a sama metoda ReadDevice zbiera dane z zewnętrznego urządzenia przez COM4 i pakuje do jednego obiektu DataFrame (też mojej "produkcji").
Teraz chcę ten obiekt dodać do listy dataFramesList z Form1... I w tym jest całe zamieszanie.
Kumpel jeszcze mi podpowiedział to rozwiązanie: http://stackoverflow.com/questions/6650691/invoke-in-windows-forms
ale gdy dodałem odpowiednik tej metody DoWorkOnUI do klasy Frame1, to nie widać jej po stronie metody ReadDevice...