Wątki - dostęp do zmiennej - transmisja

0

Witam.

Piszę programik, komunikujący się z urządzeniem przez port szeregowy. Używam do tego celu klasy SerialPort.

Nie mam problemów z połączeniem, ani wysyłaniem danych. Problem pojawia się przy odbiorze danych:

System.IO.Ports.SerialPort comport; //zmienna globalna


/*wykonywane przy starcie programu*/
comport = new System.IO.Ports.SerialPort();
comport.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(DataReceived);
/**/

/*Procedura obsługująca zdarzenie otrzymania danych:*/

public void DataReceived(object sender, EventArgs e)
{
//!!!!!!!! <- Problem!
}

Wiem, że to, co zrobiłem, zrobiłem poprawnie - rzeczywiście, przy otrzymaniu danych, procedura DataReceived jest uruchamiana. Problem w tym, że nie mam w niej dostępu do żadnych zmiennych ani obiektów zadeklarowanych poza nią. Próba odwołania się do jakiejkolwiek kontrolki, czy zmiennej globalnej kończy się wysypaniem programu. Właściwie jedyne, co udało mi się w niej umieścić, to messagebox.

Udało mi się doczytać, że spowodowane jest to tym, że procedura ta jest uruchamiana w oddzielnym wątku, który nie ma dostępu do żadnych danych. Tymczasem w takiej formie jest ona dla mnie zupełnie bezużyteczna - chciałbym, aby program po otrzymaniu danych między innymi wykonywał operacje na pliku (otwartym przy innej okazji) i wyświetlał je w kontrolce.

Co więc muszę zrobić, aby z innego wątku "dostać się" do kontrolek i zmiennych?

EDIT:
W dokumentacji znalazłem w przykładzie inny sposób odbioru danych - "ręcznie" stworzony nowy wątek i w nim pooling z próbą odczytu - ale w tym przykładzie dane są i tak wyrzucane na konsolę, a nie do głównego wątku...

0

Poczytaj o metodzie Invoke.

0

Dziękuję! Faktycznie działa.

Dodatkowe pytanie: Metoda Invoke() jest tylko w kontrolkach. Co bym musiał zrobić, gdybym na przykład pisał aplikację konsolową i nie miał żadnych kontrolek?

0

Przeprowadzic synchronizacje sam, czyli samemu sie martwic czy dwa watki korzystajace z tej samej zmiennej sie nawzajem nie 'zjedza' itp. Mozesz skorzystac np. z bloku lock albo innych mechanizmow typu semafory, monitory, itp.

1 użytkowników online, w tym zalogowanych: 0, gości: 1