Odpalenie funkcji należącej do klasy w nowym wątku

0

Witam. To mój pierwszy post na tym forum :-)

Mam funkcję CzekajNaDane należącą do klasy KlientIRC. Funkcja w parametrze bierze wskaźnik do funkcji biorącej dwa parametry typu char*. Jeśli niczego nie pomyliłem to deklaracja funkcji CzekajNaDane wyglada tak:

void KlientIRC::CzekajNaDane(void (*wskaznik_do_odbierajacej)(char * nadawca, char * tresc));

Teraz z innej funkcji tej klasy (nazywającej sie Polacz, jesli ma to znaczenie) chciałbym zmusić funkcję CzekajNaDane do działania w nowym wątku.

Z tego co znalazłem w necie to strasznie enigmatyczne rozwiązania były, a ja tu jeszcze mam dość skomplikowany parametr funkcji. Program jest pod windows więc pewnie CreateThread trzeba będzie użyć. Pomożecie :) ?

0

Nie podajesz nazw parametrów przy deklaracji wskaźnika. Czyli:

void KlientIRC::CzekajNaDane(void (*wsk)(char *, char *);
0

O TO chodzi?

0

0x666: Możliwe, że o to, jednak mój poziom zaawansowania nie pozwala mi na doprowadzenie tego do końca używając informacji z tamtego tematu. Po Twojej wypowiedzi z tamtego tematu widzę, że prawdopodobnie masz to opanowane. Czy pomógłbyś mi tak samo jak autorowi tamtego tematu?

winerfresh napisał(a)

Nie podajesz nazw parametrów przy deklaracji wskaźnika.

Mogę podawać nazwy, a jeśli mogę to z tego skorzystam, jest to dla mnie wygodniejsze.

0

No ale gdzie jest problem? Zamiast AfxBeginThread użyj CreateThread (podając w czwartym parametrze wskaźnik na KlientIRC), w funkcji wątka wywołaj metodę CzekajNaDane podając jej w parametrze wskaźnik na funkcję (który jest składową KlientIRC).


PS. jeśli piszesz w VC i kompilujesz w trybie multi-threaded, powinieneś użyć funkcji _beginthread(ex) zamiast CreateThread. Trochę to komplikuje sprawę (chodzi o przenośność), ale nie będziesz miał drobnych wycieków po użyciu niektórych funkcji biblioteki standardowej.

0

Dochodze do takiego momentu ze potrafie w nowym wątku uruchomić funkcję static. Ale z tej funkcji static nie potrafie uruchomić funkcji CzekajNaDane. This-> w staticu się nie da użyć, na wszystkie sposoby, które próbowałem kompilator się nie zgadza.

Jak tego dokonać?

Niemniej jednak dziękuję za dotychczasową pomoc, znacznie mnie ona przybliża :) Liczę, że dalej też będzie tak dobrze :)

0

No przecież w tamtym wątku masz pokazane jak to zrobić:

UINT __cdecl KlientIRC::Startuj1(LPVOID pParam) 
{
     KlientIRC* _this = (KlientIRC*)pParam; //<--- to twój this
      ...
}
0

OK, moja statyczna funkcja wyglada teraz tak:

static DWORD WINAPI WlaczOdbieranie(PVOID pvParam)
	{
		std::cout<<"jestem w statycznej"<<std::endl;
		KlientIRC* _this = (KlientIRC*)pvParam;
		_this->CzekajNaDane(funkcja_odbierajaca_dane);
		return 0;
	};

Bład jaki kompilator wypisuje przy linijce _this->CzekajNaDane(funkcja_odbierajaca_dane); :
error C2597: illegal reference to non-static member 'KlientIRC::funkcja_odbierajaca_dane'

Edit:
Bo funkcja_odbierajaca_dane to wskaznik do innej funkcji. Ten wskaznik należy do klasy KlientIRC. Co teraz trzeba zrobić ?

0

Pomyśleć. Jeśli odwołujesz się do CzekajNaDane poprzez _this->, to oczywistym jest, że w ten sam sposób musisz odwołać się do funkcja_odbierajaca_dane. Następna sprawa to to, że podajesz funkcji wskaźnik na metodę, a CzekajNaDane oczekuje wskaźnika na zwykłą funkcję lub metodę statyczną. Wskaźnik na metodę to nie to samo co wskaźnik na funkcję, rzutowanie nic tu nie da - uprzedzam.

0

Dobra, coś tam mam. Nie wiem jednak jak z tej funkcji statycznej przekazać jakąkolwiek zmienną z programu jako parametr do nowego wątku. Jeśli próbuję cokolwiek do takiej funkcji przekazać to mam podczas działania programu Access Violation.

0

No przecież jako parametr wątku podajesz obiekt klasy KlientIRC, więc wszystko inne, co chcesz przekazać do funkcji wątka, przekazujesz w tej klasie!

0

OK, już wszystko działa. Bardzo dziękuję za pomoc.

0

Kolega żródło by zaprezentował jak to wygląda.

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