Wywołanie metody z funkcji statycznej

0

Cześć. Czy ktoś zna sposób, żeby wywołać metodę z funkcji statycznej, jak poniżej?

	public ref class Form1 : public System::Windows::Forms::Form
	{...
	void Czytnik(void)
		{
		this->label1->Text = L"Jest nowa wiadomosc";
		}

	static void ResultCallback(char *Dane)  //funkcja zwraca dane z wątku
		{
		Czytnik();//error C2352: illegal call of non-static member function
		}
	}	

Mam nadzieję, że nie wygląda to tak źle, jak sugeruje poniższy cytat, bo wówczas nie ma szans na komunikację między wątkiem roboczym a interfejsem programu:

And remember, assigning class methods to normal functions won't work; they both have to be methods, or both normal functions, but not a mix, which is what I suspect you're trying to do.

0

Nie znam się na wątkach, ale wydaje mi się że to co chcesz zrobić możesz zrobić przekazując jako argument obiekt klasy Form1 do funkcji ResultCallback. I z funkcji ResultCallback wywołać metodę Czytnik przekazanego obiektu.

0

Nie możesz ze statycznej metody odwoływać się do zwykłej metody. Statyczna metoda nie operuje na żadnym konkretnym egzemplarzu danej klasy (nie ma this) a zwykła metoda potrzebuje this. Albo usuń static albo przekaż jej jakiś wskaźnik na obiekt, żeby można było wywołać jego metodę.

0

Tak, zdecydowanie konieczne jest odwołanie się przez obiekt, na którym ma zostać wykonana metoda. Będzie działać, gdy dojdę do tego, jak należy przekazywać kontrolki w parametrach ;p

Po pewnym czasie...

Nie mam już pytań:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll

Additional information: Cross-thread operation not valid: Control 'label1' accessed from a thread other than the thread it was created on.
0

Oprócz przekazania wskaźnika na obiekt możesz jeszcze użyć singletonu. Czyli wewnątrz klasy przechowywać wskaźnik na jeden jej egzemplarz i potem z tego korzystać.
Poszukaj "singleton callback" - może Wujek G coś wywróży.

0

@patman
Funkcje GUI mogą być bezpiecznie wywoływane wyłącznie z głównego wątku.
Zainteresuj się event'ami ( lub singal'ami ) do komunikacji między wątkowej.
Worker thread wysyła event/signal (jak zwał tak zwał) do głównego wątku i ten dopiero oddziałowuje na element GUI.

0

Dzięki za wskazówki, będę to testował.

Edit1: Przyglądam się eventom, i wszystko wskazuje na to, że wywołanie ich wcale nie spowoduje wysłania żądania do wątku głównego, lecz wykona się to w kontekście wątku roboczego, tak jak zwykły callback (którym de facto jest każda obsługa zdarzenia). Czy może się mylę?
Jako, że jestem zielony z managed c++, proszę o podpowiedź - czy jest szansa zrealizować taką komunikację przez komunikaty systemowe?

Edit2: Gdyby kogoś to interesowało, to dałem sobie spokój z callbackami i innymi wynalazkami. Timer rozwiązał problem. A że mało elegancko?

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