obsluga watkow

0

Witam. Wychodzac z zalozenia, iz nie ma glupich pytan oraz mojej dopiero co rozpoczynajacej sie przygody z C# mam pytanie odnosnie watkow.
Wywoluje watek:

InitializeComponent();
Thread thr = new Thread(serceProgramu);
thr.Start();
 
public void serceProgramu()
        {
...

textBox1.Text = data + "    : " + pom3 + "°C" + "\r\n" + data + "    : " + pom3_2 + "°C";

...
}

I dostaje komunikat:
Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.

Dodam iż dla elementu chart jest identycznie:

chart1.Series["xyz"].Points.AddXY(data, temp);

Czego dotyczy bląd, w jaki sposob sie go pozbyc?

1

Bład dotyczy tego, że podobnie jak w Javie, modyfikacja GUI może być wykonana tylko z wątku głównego. Tutaj próbujesz zmodyfikować go z jakiegoś pobocznego wątku.

            
this.Invoke((MethodInvoker)delegate
            {
                stopWaiting(false, false);
                textBox1.Text="this should work!";
            }); 
0

Czyli nie pozostaje mi nic innego jak podzielenie logiki i interfejsu, wykonanie logiki w watku bo jak rozumiem inaczej nie mozna...?
dzieki

0

Kod który Ci podałem, umożliwia wykonanie kawałka kodu w wątku głównym.

1

A jeśli dla jakiejś kontrolki masz wiele przypisań to alternatywna wersja rozwiązania to dziedziczenie po kontrolce i nadpisanie settera wybranego property na coś mniej-więcej jak:

set 
{
	if(this.InvokeRequired)
	{
		this.Invoke(new Action() => {this.Text = value;});
	}
	else
	{
	base.Text = value;
	}
}
0

Dzieki,
skorzystalem z rozwiazania @misiakufal i sprawdza sie tak jak chcialem,
w celu odswiezania watku wrzucilem sobie jego wywolanie w TIMER i uzyskalem animacje danych w CHART'ie co okreslony Interval - to tak dla ogolnej wiedzy, moze sie komus przyda.

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