Forum Gry Hobby Sprzęt Rozmawiamy Archiwum Regulamin

Forum: C# - odczyt wartości z wątku w głównym wątku aplikacji

07.04.2013 18:35
Toshi_
1
Toshi_
170
Got sarcasm?

C# - odczyt wartości z wątku w głównym wątku aplikacji

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...

07.04.2013 19:05
2
odpowiedz
zanonimizowany792388
37
Generał

Google: mutexy semafory

Akurat w c# nie korzystatalem z wielowatkowosci, ale implementacja tego co wyzej napisalem nie powinna sprawic zadnych problemow w tym jezyku.

07.04.2013 19:16
Toshi_
3
odpowiedz
Toshi_
170
Got sarcasm?

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.

07.04.2013 19:38
4
odpowiedz
YogiYogi
127
Generał

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...

07.04.2013 20:54
Toshi_
😍
5
odpowiedz
Toshi_
170
Got sarcasm?

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...

Forum: C# - odczyt wartości z wątku w głównym wątku aplikacji